GCC手冊:https://gcc.gnu.org/onlinedocs/
GCC編譯選項CFLAGS參數
選項 | 說明 |
-c | 用於把源碼文件編譯成 .o 對象文件,不進行鏈接,所以不產生可執行文件 |
-o | 用於連接生成可執行文件,在其后可以指定輸出文件的名稱 |
-g | 用於在生成的目標文件中,添加調試信息,可以使用GDB進行調試 |
-Idir | 用於把新目錄添加到include路徑上,可以使用相對和絕對路徑,“-I.”、“-I./include”、“-I/opt/include” |
-Wall | 生成常見的所有告警信息,且停止編譯,具體是哪些告警信息,請參見GCC手冊,一般用這個足矣! |
-w | 關閉所有告警信息 |
-O | 表示編譯優化選項,其后可跟優化等級0\1\2\3,默認是0,不優化 |
-fPIC | 用於生成位置無關的代碼 |
-v | (在標准錯誤)顯示執行編譯階段的命令,同時顯示編譯器驅動程序,預處理器,編譯器的版本號 |
-D XXX | 添加宏定義,對程序進行條件編譯 |
-fmessage-length=n | Try to format error messages so that they fit on lines of about n characters. If n is zero, then no line-wrapping is done; each error message appears on a single line. This is the default for all front ends. |
GCC鏈接選項LDFLAGS參數
選項 | 說明 |
-lxxx | -l后面緊接着庫名,鏈接時在標准搜索目錄中尋找庫文件,搜索名為libxxx.a 或 libxxx.so |
-Ldir | 用於把新目錄添加到庫搜索路徑上,可以使用相對和絕對路徑,“-L.”、“-L./include”、“-L/opt/include” |
gcc -Wl,option | 把選項 option 傳遞給連接器,如果 option 中含有逗號,就在逗號處分割成多個選項 |
-static | 使用靜態庫鏈接生成目標文件,避免使用共享庫,生成目標文件會比使用動態鏈接庫大 |
-s | 從可執行文件中刪除符號表和重定位信息,不能再用GDB調試可執行文件 |
LIBS
LDFLAGS是選項,LIBS是要鏈接的庫。LDFLAGS告訴鏈接器從哪里尋找庫文件,LIBS告訴鏈接器要鏈接哪些庫文件。
例子如下:
LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib
LIBS = -lmysqlclient -liconv
LDFLAGS指定-L雖然能讓鏈接器找到庫進行鏈接,但是運行時鏈接器卻找不到這個庫,如果要讓軟件運行時庫文件的路徑也得到擴展,那么我們需要增加這兩個庫給"-Wl,R"
LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib
如果在執行./configure以前設置環境變量export LDFLAGS="-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib" ,注意設置環境變量等號兩邊不可以有空格,而且要加上引號哦(shell的用法)。那么執行configure以后,Makefile將會設置這個選項, 鏈接時會有這個參數,編譯出來的可執行程序的庫文件搜索路徑就得到擴展了。