gcc編譯C原始檔

2022-05-21 16:18:12 字數 2125 閱讀 8034

gcc編譯c程式的主要過程是:預處理---編譯---彙編---連線,其中:(以名為hello.c的原始檔為例)

預處理:對各種預處理指令(#開頭,如#include,#define)進行處理,以及刪除注釋和多餘空白字元。生成被修改的源程式hello.i

e是通知gcc對hello.c進行預編譯;o是對命令輸出結果進行匯入操作

gcc -e hello.c -o hello.i

編譯:對**進行語法語義分析和錯誤判斷,生成彙編**檔案hello.s

s是通知gcc對目標檔案hello.i進行編譯

gcc -s hello.i -o hello.s

彙編:將彙編**轉化為計算機可識別的二進位制檔案,生成可重定位目標程式(二進位制)hello.o

c是通知gcc對目標檔案hello.s進行指令轉換操作

gcc -c hello.s -o hello.o

gcc hello.o -o hello

hello檔案即最後可以直接執行的可執行檔案,通過./hello執行,通過objdump -d hello可以將可執行檔案轉化為組合語言

或者可以直接通過執行gcc hello.c就可以直接生成二進位制目標檔案a.out,通過./a.out也可以執行結果

或者通過gcc hello.c -o hello,這樣可以給生成的檔案取名為hello

20190616補

今天在編譯gcc時遇到了問題,更新此帖記錄。

gcc -c hello.c -o hello.o

想要./hello.o輸出的時候報錯permission denied,這個問題可以通過在命令前加bash或chmod更改許可權解決:

ly@ubuntu:~/desktop$ ./hello.o

bash: ./hello.o: permission denied

ly@ubuntu:~/desktop$ bash ./hello.o

./hello.o: ./hello.o: cannot execute binary file

ly@ubuntu:~/desktop$ chmod 777 hello.o

ly@ubuntu:~/desktop$ ./hello.o

bash: ./hello.o: cannot execute binary file: exec format error

ly@ubuntu:~/desktop$ gcc hello.c -o hello

ly@ubuntu:~/desktop$ ./hello

hello

ly@ubuntu:~/desktop$ gcc hello.c

ly@ubuntu:~/desktop$ ./a.out

hello

之前整理的三種方式都可以生成可執行檔案。

ly@ubuntu:~/desktop$ file ./a.out

./a.out: elf 64-bit lsb executable, x86-64, version 1 (sysv), dynamically linked, interpreter /lib64/l, for gnu/linux 2.6.32, buildid[sha1]=2cf583ee1d914378202ee3968923649fcbb01514, not stripped

ly@ubuntu:~/desktop$ file ./hello.o

./hello.o: elf 64-bit lsb relocatable, x86-64, version 1

(sysv), not stripped

ly@ubuntu:~/desktop$ file ./hello

./hello: elf 64-bit lsb executable, x86-64, version 1 (sysv), dynamically linked, interpreter /lib64/l, for gnu/linux 2.6.32, buildid[sha1]=2cf583ee1d914378202ee3968923649fcbb01514, not stripped

gcc 編譯多個原始檔

一.常用編譯命令選項 假設源程式檔名為test.c。3.選項 e 用法 gcc e test.c o test.i 作用 將test.c預處理輸出test.i檔案。4.選項 s 用法 gcc s test.i 作用 將預處理輸出檔案test.i彙編成test.s檔案。5.選項 c 用法 gcc c ...

gcc 編譯多個原始檔

一.常用編譯命令選項 假設源程式檔名為test.c。1.無選項編譯鏈結 用法 gcc test.c 作用 將test.c預處理 彙編 編譯並鏈結形成可執行檔案。這裡未指定輸出檔案,預設輸出為a.out。2.選項 o 用法 gcc test.c o test 作用 將test.c預處理 彙編 編譯並鏈...

gcc 編譯多個原始檔

一.常用編譯命令選項 假設源程式檔名為test.c。3.選項 e 用法 gcc e test.c o test.i 作用 將test.c預處理輸出test.i檔案。4.選項 s 用法 gcc s test.i 作用 將預處理輸出檔案test.i彙編成test.s檔案。5.選項 c 用法 gcc c ...