cc1과 gcc의 관계는?


23

리눅스 서버 (루트 액세스없이)의 홈 디렉토리에 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에 대한 언급이 없으며 Googling은 유용한 정보를 얻지 못했습니다 cc1. 장소 gcc가 실패했습니다.

그들 사이의 관계는 정확히 무엇입니까? 그리고이 기계에서 Ruby를 컴파일 할 희망이 있습니까?

답변:


28

GCC에는 컴파일 단계가 다양하며 각 단계를 수행하기 위해 다른 내부 명령을 사용합니다. 특히 C는 먼저 cpp로 사전 처리 된 후 어셈블리로 컴파일되고 기계어로 조립 된 다음 서로 연결됩니다.

cc1은 사전 처리 된 C 언어 파일을 가져 와서 어셈블리로 변환하는 내부 명령입니다. C를 컴파일하는 것은 실제 부분입니다. C ++의 경우 cc1plus 및 다른 언어에 대한 다른 내부 명령이 있습니다.

Wikibooks 에 그림이있는 과정설명 하는 책 이 있습니다 .

불행하게도 cc1은 내부 명령이며 설치의 한 부분 일 뿐이며 이것이 전부라면 컴파일 할 수 없습니다.


2
일반적인 용어는 "프론트 엔드"입니다.
Keith Thompson

1
사전 처리 된 C 파일이 필요합니까? cc1파일 #include#define지시문을
제출할

10

gcc이 제품군의 이름은이 제품군 cc의 C 컴파일러 일뿐입니다.

단어 cc가 드문 아니라, 예를 들면 그것은 또한 유닉스 시스템에서 주어진 C 컴파일러에 대한 일반적인 이름의이라는 환경 변수를 찾기 위해 CC주어진 구축 스크립트 나 구성 스크립트를, 당신은 교류에 현학적이 변수는 일반적으로 점 수 있도록하려면 컴파일 된 객체의 링크를 반드시 수행 할 필요는없는 컴파일러는 보통 "그냥"컴파일하는 컴파일러를 나타내는 데 사용됩니다. 그러나 ccfrom gcc은 완성 된 실행 파일을 출력 할 수 있으므로 링커를 사용하여이 최종 단계를 수행 할 수도 있습니다.

cc1종종 "내부적으로"사용되는 단어 나 GNU 문서를 읽을 때 ( :) 어떤 언어 나 컴파일러에 따라 gcc 관련 라이브러리의 이름을 지정하는 데 사용됩니다 (이 경우 cc1 = c 컴파일러에 속함).

실제로 gcc단어의 의미가 무엇인지 묻는다면cc1

gcc -print-prog-name=cc1

cc 컴파일러의 라이브러리 경로로 응답해야하므로 실제 실행 파일이 아닌 라이브러리 인 무언가를 실행하려고합니다.

CC를 c 컴파일러 로 기억 하고 모든 것을 단순화 하고이 cc1을 우회하는 것이 훨씬 간단합니다 . 장거리 여행을 시작하지 않으면 내부적으로 작동하는 방식을 알 필요가 없습니다.


4

다른 사람들이 언급했듯이을 gcc사용합니다 cc1.

호출 및 호출 되는 다른 서브 프로그램 의 정확한 방법 은 스펙 파일 형식에 의해 결정됩니다 .cc1cppld

현재 스펙 파일은 다음을 사용하여 볼 수 있습니다.

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에 전달 된 명령 줄 옵션은 하위 프로세스 호출 방식을 간접적으로 변경합니다. 그러나 사양 파일을 조작하면 유연성이 높아지고 명령 줄 옵션으로 할 수없는 작업을 수행 할 수 있습니다 (예 : /programming/7493620/inhibit-default-library-paths-with-gcc).

다음을 통해 쉽게 실행중인 것을 관찰 할 수 있습니다.

gcc -v hello_world.c |& grep cc1

샘플 출력 :

/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

1

cc1 입력은 C 소스 코드이고 출력은 어셈블리 코드 인 전 처리기 및 컴파일러입니다.

cc1(구문에 따라 구문에 따라 다름)을 실행하여 호출 된 명령 중 하나 (실제 첫 번째)를 볼 수 있습니다 .
gcc-8 -v SOMESOURCE.c

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.