GCC: GNU C Compiler; GNU Compiler Collection
常用基本命令
gcc test.c -o test
上述編譯過程分爲
預處理 Preprocessing
gcc -E test.c -o test.i 或 gcc -E test.c
gcc的-E選項,可以讓編譯器在預處理後停止,並輸出預處理結果。
編譯 Compilation
gcc -S test.i -o test.s
gcc的-S選項,表示在程序編譯期間,在生成彙編代碼後,停止,-o輸出彙編代碼文件。
彙編 Assembly
gcc -c test.s -o test.o
連接 Linking
gcc test.o -o test
將程序的目標文件與所需的所有附加的目標文件連接起來,最終生成可執行文件。附加的目標文件包括靜態連接庫和動態連接庫。
編譯多個文件
如果程序多個源文件,並且最終生成可執行文件test
gcc test1.c test2.c -o test
若同時處理的文件不止一個,那麼GCC依舊會按照預處理,編譯,鏈接的過程進行:
上述命令相當於依次執行
gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc test1.o test2.o -o test
Debug
gcc -Wall illcode.c -o illcode
使用 -Wall
能夠使GCC產生儘可能多的警告信息。
gcc -Werror test.c -o test
使用 -Werror
可以讓GCC在所有產生警告的地方停止編譯。
鏈接庫文件
在linux中,大多數函數的頭文件會被放到
/usr/include
中,庫文件一般放在/usr/lib
中。
在linux中,庫文件分爲兩類,分別是 動態鏈接庫
.so
,和 靜態鏈接庫.a
。兩者的區別在於程序執行時所需的代碼是在運行時動態加載的,還是在編譯時靜態加載的。
編譯成可執行文件
gcc –c –I /usr/dev/mysql/include test.c –o test.o
鏈接
gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test
默認情況下,GCC鏈接時優先使用靜態鏈接庫,只有在動態鏈接庫不存在的時候才使用靜態鏈接庫,如果需要強制使用靜態鏈接庫,那麼加入
-static
靜態庫鏈接時搜索路徑順序:
- ld會去找GCC命令中的參數-L
- 再找gcc的環境變量LIBRARY_PATH
- 再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程序內的
動態鏈接時、執行時搜索路徑順序:
- 編譯目標代碼時指定的動態庫搜索路徑
- 環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑
- 配置文件/etc/ld.so.conf中指定的動態庫搜索路徑
- 默認的動態庫搜索路徑/lib
- 默認的動態庫搜索路徑/usr/lib
有關環境變量:
LIBRARY_PATH
環境變量:指定程序靜態鏈接庫文件搜索路徑
LD_LIBRARY_PATH
環境變量:指定程序動態鏈接庫文件搜索路徑
Reference
https://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html