2011-12-15 15 views
21

Jeśli masz prosty program w C, jakRunning kroki GCC ręcznie, kompilacja, montaż, łączenie

int main(void) {return 0;} 

Może być skompilowany z gcc -o test test.c.

Jak rozumiem, gcc wykonuje kompilację, łączenie, a następnie łączenie. Te dwa ostatnie kroki zostały osiągnięte dzięki uruchomieniu as i ld.

Potrafię wygenerować kod zespołu za pomocą gcc -S test.c.

Co wpisać w terminal, aby przekonwertować kod zestawu do pliku wykonywalnego?

(powodem takiego postępowania jest montaż nauczyć)

+2

W rzeczywistości najpierw wykonuje wstępne przetwarzanie, a następnie kompiluje, a następnie montuje, a następnie łączy. Przetwarzanie wstępne może być nietrywialną częścią procesu, zwłaszcza jeśli użyjesz funkcji Boost ... –

+2

Możesz użyć parametru '-v', aby zobaczyć, jak GCC wywołuje podprogramy, np. GCC. 'gcc -o test test.c -v' – mizo

Odpowiedz

39

Są różne etapy używając gcc

gcc -E --> Preprocessor, but don't compile 
gcc -S --> Compile but don't assemble 
gcc -c --> assemble but don't link 
gcc with no switch will link your object files and generate the executable 
+2

Obecne wersje GCC nie mają już oddzielnego preprocesora (możesz poprosić o tylko wstępne przetwarzanie jak powyżej). – vonbrand

+0

Dobra odpowiedź, szkoda, że ​​nie wyjaśnia zbyt wiele – CristiFati

1

Po wykonaniu gcc -S -o test.s test.c, typ gcc -o test test.s.

3

gcc test.s -o test skompiluje dla ciebie test z test.s.

NASM może być warta twojego czasu - może być łatwiejszy/bardziej przyjazny niż gcc do kompilowania zespołu.

+0

Niezupełnie. 'gcc' obsługuje dla ciebie wiele biurokracji zależnych od systemu, w pełnej zgodności z tym, jak obsługuje inne elementy twojego projektu. – vonbrand

0

Możesz mieć gcc rozpocząć i zatrzymać proces kompilacji, gdziekolwiek chcesz. gcc test.s -o test spowoduje kompilację test.s z zestawu do pliku wykonywalnego.

0

Jak może lub nie może wiedzieć, cztery etapy kompilacji mają Preprocesuj (-E), skompilować do montażu (-S), montaż na obiekcie code (-c), a na końcu link. Najtrudniej mi było dowiedzieć się, jak używać wyjścia preprocesora. Oto jak to zrobić:

gcc -E hello.c | gcc -S -xc -o hello.s - 
gcc -c hello.s -o hello.o 
gcc hello.o -o hello 
Powiązane problemy