GCC編譯選項

 

  • 編譯與連接

編譯(compile):將.c或.cpp文件編譯成.o(linux)或者.obj(windows)文件,也稱爲中間目標文件linux

連接(link):將.o或.obj連接成可執行文件,windows下是.exe結尾,Linux沒有限制,通常不帶有後綴名macos

庫文件:大型項目編譯時生成的目標文件太多,主要是給中間目標文件打包windows

靜態 => .a .lib,在連接時生成執行文件函數

動態 => .so .dll,由執行文件運行時加載優化

 

  • 實例,選項通常無前後關係

gcc xxx.c,編譯成功後默認生成a.out執行文件 => ./a.outlua

gcc  xxx.c -o demo 或 gcc -o demo xxx.c spa

gcc  xxx.o -o demo調試

gcc  xxx.c -S demo.sip

gcc  xxx.i -o demo內存

 

  • 選項:
    • -v,打印較多的編譯信息
    • -x,指定編譯雨語言,缺省狀況編譯器根據文件末尾格式來肯定
    • -o,輸出指定執行文件
    • -Wall,打開警告選項,建議開啓
    • -w,不生成任何警告信息
    • -E,僅預處理,生成.i文件
    • -S,僅編譯到彙編,生成.s文件
    • -C,編譯到目標代碼,生成.o文件,經過最後一步連接生成目標文件
    • -M,自動尋找源文件找包含的頭文件,如 gcc -M main.c,此時在依賴項中沒必要填寫須要引入的頭文件。-M有可能會包含多餘的頭文件,能夠才用-MM
    • -I/usr/local/include,引入頭文件目錄
    • -L/usr/local/lib,引入庫文件地址
    • -lliblua.a,引入庫文件liblua.a
    • -shared,生成共享的庫文件,生成動態庫須要與-fPIC一塊兒使用,如 -fPIC -shared
    • -fPIC,做用於編譯階段,告訴編譯器產生與位置無關代碼(Position-Independent Code),  則產生的代碼中,沒有絕對地址,所有使用相對地址,故而代碼能夠被加載器加載到內存的任意位置,均可以正確的執行。這正是共享庫所要求的,共享庫被加載時,在內存的位置不是固定的
    • -static,禁止使用共享連接
    • -pipe,使用管道替代臨時文件
    • -g,生成調試信息

 

 

Mac下編譯lua動態庫,須要加上-dynamiclib -Wl,-undefined,dynamic_lookup,如編譯ding.c,如下爲Makefile裏面文件內容:

linux:

#默認頭文件頭文件地址/usr/local/include

gcc ding.c -fPIC -shared -o ding.so

macosx:

gcc ding.c -fPIC -dynamiclib -Wl,-undefined,dynamic_lookup -shared -o ding.so -I/usr/local/include/lua

 

  • 編譯優化選項,O0 => O1 => O2 => O3開啓的優化選項逐步加大,優化過的代碼執行效率更佳,如kernel用O0是沒法編譯經過的,只能使用O2或Os
    • -O2,基於運行速度優化
    • -Os,基於目標生成文件size更小優化

     以上二者都能使部分函數自動inline。項目應該追求在O2的優化下能編譯經過,若是在全局優化下,針對局部避免優化,能夠嘗試使用noinline 或 __attribute__((optimize(「O0」)))來修飾函數。

相關文章
相關標籤/搜索