Cc1 ve gcc arasındaki ilişki?


23

Ruby'yi ev dizinimde bir Linux sunucusuna (root erişimi olmadan) kullanmaya çalışıyorum gcc. Bulabildiğim en yakın şey, (yeterince derinlere inirseniz) içerdiği isimdeki bir dizindir 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

Aslında Wikipedia'da GCC için CC1 yönlendirmeleri kimliğine şey yakın ima eder gibi görünmektedir, ancak yeniden yönlendirme hakkında not yanında GCC sayfasındaki CC1 başka hiçbir söz var ve Googling kullanışlı bana bir şey kazanılmış ve kullanım benim girişimleri olmamıştır cc1içinde yeri gccbaşarısız oldu.

Aralarındaki ilişki tam olarak nedir? Ve bana bu makinede Ruby'yi derleme umudunu sunuyor mu?

Yanıtlar:


28

GCC'nin derlenmesi için bir takım aşamaları vardır ve her fazı yapmak için farklı iç komutlar kullanır. Özellikle C ilk önce cpp ile ön işleme tabi tutulur, daha sonra montajda derlenir, makine dilinde birleştirilir ve sonra birbirine bağlanır.

cc1, önceden işlenmiş C dili dosyalarını alan ve derlemeye dönüştüren iç komuttur. C'yi derleyen asıl kısım C ++ için, cc1plus ve farklı diller için diğer dahili komutlar var.

Vikikitap'taki süreci resimlerle açıklayan bir kitap var .

Ne yazık ki, cc1 bir iç komuttur ve kurulumun yalnızca bir parçasıdır ve elinizde tek şey varsa, bir şeyleri derleyemezsiniz.


2
Her zamanki terim "ön uç".
Keith Thompson

1
Önceden işlenmiş C dosyaları gerektirdiğinden emin misiniz? Ben muktedir görünüyor cc1dosyalar #includeve #definedirektifler
extremeaxe5

10

gccsüitin ismi ccbu süitin C derleyicisidir.

kelime ccaynı zamanda unix sistemlerinde verilen herhangi bir c derleyicisi için de genel bir isimdir, örneğin CCverilen bir bina betiğinde veya configure betiğinde adı verilen bir ortam değişkenini bulmak nadir değildir ve bilgiçlik sahibi olmak istiyorsanız, bu değişken genellikle ac'a işaret eder. Derlenmiş nesnenizin bağlantısını mutlaka gerçekleştirmeyen derleyici, genellikle "sadece" derleyen bir derleyiciye başvurmak için kullanılır. ccgelen gcc, ancak, çıkış mümkün bitmiş bir çalıştırılabilir, böylece çok onun bir bağlayıcı ile bu son adımı gerçekleştirmek için edebilmektedir.

kelime cc1genellikle "dahili" olarak kullanılır veya GNU belgelerini okurken ( örnek ), aynı zamanda ait oldukları dilden veya derleyiciden yola çıkarak gcc ile ilgili kütüphaneyi adlandırmak için de kullanılır (bu durumda cc1 = c derleyicisine aittir).

gcckelimenin anlamını sorarsanız infactcc1

gcc -print-prog-name=cc1

cc derleyici için kütüphane yolunu cevaplamalıdır, bu nedenle gerçek bir çalıştırılabilir değil kütüphane olan bir şeyi çalıştırmaya çalışıyorsunuzdur.

CC'yi c derleyicisi olarak hatırlamak ve her şeyi basitleştirmek çok kolaydır , bu cc1'i atlayın, uzun bir yolculuğa çıkmak istemediğiniz sürece işlerin dahili olarak nasıl çalıştığını bilmenize gerek yoktur.


4

Diğerlerinin dediği gibi gcckullanır cc1.

Kesin bir şekilde hangi cc1ve benzeri diğer alt programa cppve lddenir tarafından belirlenir yapılır Spec dosyalar biçiminde.

Geçerli özellik dosyası ile görüntülenebilir:

gcc -dumpspecs

İlgili bölüm şöyle görünüyor:

*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}

Ve kendi spec dosyanızı aşağıdakilerle kullanabilirsiniz:

gcc -specs=<specs-file>

Tabii ki, GCC'ye iletilen komut satırı seçenekleri, alt işlemlerin nasıl çağrıldığını dolaylı olarak değiştirmektedir. Ancak spec dosyalarını değiştirmek size daha fazla esneklik sağlar ve komut satırı seçeneklerinin yapamayacağı şeyleri yapmanızı sağlar, örneğin /programming/7493620/inhibit-default-library-paths-with-gcc

Neyin kolayca çalıştırıldığını gözlemleyebilirsiniz:

gcc -v hello_world.c |& grep cc1

Örnek çıktı:

/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 hem önişleyici hem de girişi C kaynak kodu ve çıkışı da montaj kodu olan derleyicidir.

Gördüğünüz cc1gibi komutlardan biri (aslında birincisi) verilen (versiyona bağlı olan sözdizimi):
gcc-8 -v SOMESOURCE.c

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.