Próbuję zainstalować Ruby w moim katalogu domowym na serwerze Linux (bez dostępu do konta root), co oczywiście wymaga użycia gcc
. Najbliższa rzecz, jaką mogę znaleźć, to katalog o tej nazwie, który (jeśli przejdziesz wystarczająco głęboko) zawiera 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
Fakt, że CC1 przekierowuje do GCC na Wikipedii wydaje się sugerować coś zbliżonego do tożsamości, jednak nie ma innej wzmianki o CC1 na stronie GCC poza notatką o przekierowaniu, a Googling nie przyniósł mi niczego użytecznego, a moje próby użycia cc1
w miejsce gcc
zawiodło.
Jaki dokładnie jest związek między nimi? I czy daje mi to jakąkolwiek nadzieję na skompilowanie Rubiego na tym komputerze?
cc1
plików z#include
i#define
dyrektywgcc
nazwa pakietucc
to tylko kompilator C z tego pakietu.słowo
cc
to jest także ogólną nazwą dla dowolnego kompilatora c w systemach uniksowych, na przykład nierzadko znajduje się zmienną środowiskową wywoływanąCC
w danym skrypcie budowlanym lub skrypcie konfiguracyjnym, a jeśli chcesz być pedantyczny, ta zmienna zwykle wskazuje ac kompilator, który niekoniecznie wykonuje łączenie skompilowanego obiektu, zwykle jest używany w odniesieniu do kompilatora, który „po prostu” kompiluje.cc
fromgcc
jest jednak w stanie wygenerować gotowy plik wykonywalny, więc jest w stanie wykonać ten ostatni krok również za pomocą swojego linkera.słowo,
cc1
które często jest używane „wewnętrznie” lub podczas odczytywania dokumentów GNU ( przykład ), służy również do nazewnictwa biblioteki związanej z gcc na podstawie języka lub kompilatora, do którego należą (w tym przypadku cc1 = należy do kompilatora c).w rzeczywistości, jeśli zapytasz,
gcc
jakie jest znaczenie tego słowacc1
powinien odpowiedzieć ścieżką do biblioteki dla kompilatora cc, więc próbujesz wykonać coś, co jest biblioteką, a nie prawdziwym plikiem wykonywalnym.
o wiele łatwiej jest zapamiętać CC jako kompilator c i uprościć wszystko, omijając ten cc1, nie musisz wiedzieć, jak rzeczy działają wewnętrznie, chyba że chcesz rozpocząć długą podróż.
źródło
Jak wspomniano inni,
gcc
używacc1
.Dokładny sposób, w jaki
cc1
i innego podprogramu jakcpp
ild
nazywa odbywa zależy od specyfikacji plików PDF.Bieżący plik specyfikacji można wyświetlić za pomocą:
Odpowiednią sekcją wydaje się być:
I możesz użyć własnego pliku specyfikacji z:
Oczywiście opcje wiersza poleceń przekazane do GCC pośrednio zmieniają sposób wywoływania podprocesów. Ale manipulowanie plikami specyfikacji daje większą elastyczność i pozwala robić rzeczy, których nie mogą wykonywać opcje wiersza poleceń, np. Https://stackoverflow.com/questions/7493620/inhibit-default-library-paths-with-gcc
Możesz łatwo obserwować, co jest uruchamiane:
Przykładowe dane wyjściowe:
źródło
cc1
jest zarówno preprocesorem, jak i kompilatorem, którego wejściem jest kod źródłowy C, a wyjściem kod asemblera.Możesz zobaczyć, że
cc1
jest to jedno z wywoływanych poleceń (w rzeczywistości pierwsze), wydając (składnia zależna od wersji):gcc-8 -v SOMESOURCE.c
źródło