Отношения между cc1 и gcc?

23

Я пытаюсь установить Ruby в своем домашнем каталоге на сервере Linux (без корневого доступа), который, конечно, требует использования 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 перенаправляет на GCC в Википедии, кажется, подразумевает нечто близкое к идентичности, однако на странице GCC нет иного упоминания о CC1, кроме заметки о перенаправлении, и Googling не принес мне ничего полезного, и мои попытки использовать cc1в место gccпровалилось.

Какие именно отношения между ними? И дает ли это мне надежду на компиляцию Ruby на этой машине?

иконоборец
источник

Ответы:

28

GCC имеет несколько фаз для своей компиляции, и он использует различные внутренние команды для выполнения каждой фазы. В частности, C сначала предварительно обрабатывается с помощью cpp, затем компилируется в ассемблер, собирается на машинном языке и затем связывается вместе.

cc1 - это внутренняя команда, которая берет предварительно обработанные файлы на языке C и преобразует их в сборку. Это фактическая часть, которая компилирует C. Для C ++ есть cc1plus и другие внутренние команды для разных языков.

В Викиучебнике есть книга, которая объясняет процесс с помощью картинок .

К сожалению, cc1 - это внутренняя команда и только одна часть установки, и если это все, что у вас есть, вы не сможете скомпилировать вещи.

Алан Шутко
источник
2
Обычный термин - «передний конец».
Кит Томпсон
1
Вы уверены, что требуется предварительно обработанные файлы C? Я, кажется, могу cc1файлы #includeи #defineдирективы
extremeaxe5
10

gccэто имя набора ccпросто компилятор C из этого набора.

Слово ccэто также общее имя для любого данного компилятора c в системах Unix, например, нередко найти переменную окружения, вызываемую CCв данном сценарии сборки или скрипте конфигурации, и если вы хотите быть педантичным, эта переменная обычно указывает на переменную компилятор, который не обязательно выполняет компоновку вашего скомпилированного объекта, он обычно используется для ссылки на компилятор, который «просто» компилируется. ccОднако from gccможет выводить готовый исполняемый файл, поэтому может выполнить этот последний шаг и со своим компоновщиком.

Слово, cc1которое часто используется «внутренне» или при чтении документации GNU ( пример ), также используется для именования библиотеки, связанной с gcc, в зависимости от того, к какому языку или компилятору они принадлежат (в данном случае cc1 = принадлежит компилятору c).

на самом деле, если вы спросите, gccчто означает словоcc1

gcc -print-prog-name=cc1

он должен дать путь к библиотеке для компилятора cc, поэтому вы пытаетесь выполнить что-то, что является библиотекой, а не реальным исполняемым файлом.

гораздо проще запомнить CC как c-компилятор и упростить все, обходя этот cc1, вам не нужно знать, как все работает внутри, если вы не хотите начать долгое путешествие.

user2384250
источник
4

Как уже упоминалось, gccиспользует cc1.

Точный способ , в котором cc1и другой подпрограмме , как 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, косвенно изменяют способ вызова подпроцессов. Но манипулирование файлами спецификаций дает вам большую гибкость и позволяет вам делать вещи, которые недоступны для параметров командной строки, например, /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
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
1

cc1 это и препроцессор, и компилятор, чьи входные данные - это исходный код на C, а выходные - код сборки.

Вы можете видеть, cc1что одна из команд, вызываемых (фактически, первой), выдает (синтаксис зависит от версии):
gcc-8 -v SOMESOURCE.c

flow2k
источник