Зв'язок між 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 у Вікіпедії, схоже, означає щось близьке до ідентичності, однак, немає жодної згадки про CC1 на сторінці GCC, крім примітки про переадресацію, і Googling не отримав мені нічого корисного і мої спроби використання cc1в місце gccпровалу.

Які саме стосунки між ними? І чи пропонує мені будь-яка надія скласти Рубі на цій машині?

Відповіді:


28

GCC має ряд фаз для свого складання, і він використовує різні внутрішні команди для виконання кожної фази. Зокрема, C спочатку попередньо обробляється cpp, потім компілюється в збірку, збирається на машинну мову і потім з'єднується.

cc1 - це внутрішня команда, яка бере попередньо оброблені файли на мові С та перетворює їх на збірку. Це фактична частина, яка компілює C. Для C ++ є cc1plus та інші внутрішні команди для різних мов.

У Вікікнижках є книга, яка пояснює процес із зображеннями .

На жаль, cc1 - це внутрішня команда і лише один фрагмент установки, і якщо це все, що у вас є, ви не зможете складати речі.


2
Звичайний термін - «передній край».
Кіт Томпсон

1
Ви впевнені, що для цього потрібні попередньо оброблені файли C? Я, здається, вмію cc1файли #includeі #defineдирективи
extremeaxe5

10

gccце ім'я набору cc- це просто компілятор C із цього набору.

слово ccце також загальне ім'я для будь-якого компілятора c в системах Unix, наприклад, не рідко можна знайти змінну середовища, яка називається CCв заданому сценарії побудови або налаштування сценарію, і якщо ви хочете бути педантичним, ця змінна зазвичай вказує на зміну компілятор, який не обов'язково виконує посилання вашого компільованого об'єкта, його зазвичай використовують для позначення компілятора, який "просто" збирає. ccвід gcc, однак, може виводити готовий виконуваний так здатний виконати цей останній крок з його линкера теж.

слово cc1, яке часто використовується "внутрішньо" або під час читання документів GNU ( приклад ), воно також використовується для іменування бібліотеки, пов'язаної з gcc, залежно від того, до якої мови чи компілятора вони належать (у цьому випадку cc1 = належить компілятору c).

infact, якщо ви запитаєте, gccяке значення цього словаcc1

gcc -print-prog-name=cc1

вона повинна відповідати шляхом до бібліотеки для компілятора cc, тому ви намагаєтеся виконати щось, що є бібліотекою, а не справжньою версією.

набагато простіше запам’ятати CC як компілятор c і спростити все, обійшовши цей cc1, вам не потрібно знати, як все працює внутрішньо, якщо ви не хочете розпочати довгу подорож.


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

1

cc1 є і препроцесором, і компілятором, вхідним кодом якого є вихідний код C, а вихідним - код складання.

Ви можете побачити cc1одну з команд, на яку викликається (перша, фактично), видавши (синтаксис залежить від версії):
gcc-8 -v SOMESOURCE.c

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.