cc1과 gcc의 관계는 무엇입니까?

cc1과 gcc의 관계는 무엇입니까?

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

gcccc제품군의 C 컴파일러인 제품군의 이름입니다 .

it이라는 단어는 ccUNIX 시스템에서 특정 c 컴파일러의 일반 이름이기도 합니다. 예를 들어, 특정 빌드 스크립트 또는 구성 스크립트 내에서 환경 변수를 호출하는 것은 일반적입니다 CC. c를 가리키며 반드시 실행을 의미하지는 않습니다. 객체가 컴파일되는 컴파일러입니다. 이는 종종 "컴파일만"하는 컴파일러를 가리키는 데 사용됩니다. 그러나 ccfrom은 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

관련 정보