Linux 서버의 홈 디렉토리(루트 액세스 없이)에 Ruby를 설치하려고 하는데, 물론 gcc
. cc1
:
>: find / -iname gcc 2> /dev/null
/usr/libexec/gcc
>: tree -if /usr/libexec/gcc
/usr/libexec/gcc
/usr/libexec/gcc/x86_64-redhat-linux
/usr/libexec/gcc/x86_64-redhat-linux/4.1.1
/usr/libexec/gcc/x86_64-redhat-linux/4.1.1/cc1
/usr/libexec/gcc/x86_64-redhat-linux/4.1.2 -> 4.1.1
사실은CC1은 Wikipedia의 GCC로 리디렉션됩니다.신원에 가까운 것을 암시하는 것 같지만 리디렉션에 대한 참고 사항 외에는 GCC 페이지에 CC1에 대한 다른 언급이 없으며 인터넷 검색으로는 유용한 정보를 얻지 못했고 cc1
대신 사용하려는 시도 gcc
도 실패했습니다.
그들 사이의 관계는 무엇입니까? 이 컴퓨터에서 Ruby를 컴파일할 수 있다는 희망을 갖게 됩니까?
답변1
GCC에는 여러 단계의 컴파일이 있으며 각 단계를 완료하기 위해 다양한 내부 명령을 사용합니다. 특히 C의 경우 먼저 cpp로 전처리한 후 어셈블리로 컴파일하고 기계어로 어셈블한 후 서로 연결합니다.
cc1은 전처리된 C 언어 파일을 가져와서 어셈블리 언어로 변환하는 내부 명령입니다. C를 컴파일하는 실제 부분입니다. C++의 경우 다양한 언어에 대한 cc1plus 및 기타 내장 명령이 있습니다.
Wikibooks에 책이 있습니다사진으로 과정을 설명해주세요.
불행하게도 cc1은 내부 명령이고 설치의 일부일 뿐입니다. 그게 전부라면 컴파일할 수 없습니다.
답변2
gcc
cc
제품군의 C 컴파일러인 제품군의 이름입니다 .
it이라는 단어는 cc
UNIX 시스템에서 특정 c 컴파일러의 일반 이름이기도 합니다. 예를 들어, 특정 빌드 스크립트 또는 구성 스크립트 내에서 환경 변수를 호출하는 것은 일반적입니다 CC
. c를 가리키며 반드시 실행을 의미하지는 않습니다. 객체가 컴파일되는 컴파일러입니다. 이는 종종 "컴파일만"하는 컴파일러를 가리키는 데 사용됩니다. 그러나 cc
from은 gcc
완성된 실행 파일을 출력할 수 있으므로 해당 링커를 사용하여 최종 단계도 수행할 수 있습니다.
이 용어는 cc1
종종 "내부적으로" 사용되거나 GNU 문서(예), gcc 관련 라이브러리가 속한 언어나 컴파일러에 따라 이름을 지정하는 데에도 사용됩니다(이 경우 cc1 = c 컴파일러에 속함).
사실 gcc
그 말이 무슨 뜻이냐고 묻는다면cc1
gcc -print-prog-name=cc1
cc 컴파일러의 라이브러리 경로로 응답해야 하므로 실행하려는 것은 실제 실행 파일이 아닌 라이브러리입니다.
CC가 더 쉽다는 것을 기억하세요C 컴파일러그리고 모든 것을 단순화하기 위해 이 cc1을 둘러보면 긴 여정을 시작하려는 경우가 아니면 내부적으로 일이 어떻게 작동하는지 알 필요가 없습니다.
답변3
다른 사람들 이 언급했듯이 gcc
.cc1
이것정밀한cc1
및 기타 서브루틴(예: and)은 다음에 의해 cpp
호출됩니다.ld
사양 문서체재.
현재 사양 파일은 다음을 통해 볼 수 있습니다.
gcc -dumpspecs
관련 부분은 다음과 같습니다.
*cc1_options:
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %{!iplugindir*:%{fplugin*:%:find-plugindir()}} %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*} %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{Qy:} %{-help:--help} %{-target-help:--target-help} %{-version:--version} %{-help=*:--help=%*} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{coverage:-fprofile-arcs -ftest-coverage}
자신만의 사양 파일을 사용할 수 있습니다.
gcc -specs=<specs-file>
물론 GCC에 전달된 명령줄 옵션은 하위 프로세스가 호출되는 방식을 간접적으로 변경합니다. 그러나 사양 파일은 더 많은 유연성을 제공하고 다음과 같이 명령줄 옵션으로는 수행할 수 없는 작업을 수행할 수 있게 해줍니다.https://stackoverflow.com/questions/7493620/inhibit-default-library-paths-with-gcc
다음 명령을 사용하면 실행 중인 내용을 쉽게 관찰할 수 있습니다.
gcc -v hello_world.c |& grep cc1
명시된 바와 같이:https://stackoverflow.com/questions/40572041/how-to-make-gcc-show-the-internal-commands-known
예제 출력:
/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -quiet -v -imultiarch x86_64-linux-gnu hello_world.c -quiet -dumpbase hello_world.c -mtune=generic -march=x86-64 -auxbase hello_world -version -fstack-protector -Wformat -Wformat-security -o /tmp/ccvcVNAX.s
답변4
cc1
이는 전처리기이자 컴파일러입니다. 입력은 C 소스 코드이고 출력은 어셈블리 코드입니다.
cc1
실행을 통해 호출되는 명령 중 하나(실제로는 첫 번째 명령)를 볼 수 있습니다 (구문은 버전에 따라 다름).
gcc-8 -v SOMESOURCE.c