gcc編譯選項

2021-10-10 06:07:52 字數 2078 閱讀 5946

一. ar編譯指令

將編譯好的.o檔案,合併成乙個.a靜態庫

二. 編譯選項

1.-i(大寫的i):頭檔案目錄

2.-l(大寫的l):庫路徑。比方說指定了某個路徑為庫的路徑,則編譯時第一時間會在該路徑下尋找庫,尋找的路徑順序為:指定路徑–>/lib–>/usr/lib–>/usr/local/lib

3.-l(小寫的l):指定程式要鏈結的庫

常用的編譯選項:

(1)-lm:鏈結m動態庫,即math數學庫

(2)-static –lm:鏈結m靜態庫

(3)-ldl:當**中用到dlopen,dlsym,dlclose,dlerror顯示載入動態庫時,需加上

(4)-lstdc++:加上該編譯選項表示編譯c++檔案,鏈結c++庫

(5)-lc:表示編譯c檔案,鏈結c庫,gcc預設編譯c檔案和鏈結c庫,當編譯c檔案時可以不用額外加該選項

(6)-lpthread:鏈結到pthread的庫(1、-lpthread是較為老式的解決方法,pthread新加了對於巨集d_reentrant的定義,-pthread會被展開為「-d_reentrant -lpthread」,它不僅可以鏈結pthread庫,還可以開啟系統標頭檔案中的各種多執行緒支援分支,比如,我們常常使用的錯誤碼標誌errno,如果沒有定義_reentrant,則實現為乙個全域性變數;若是定義了_reentrant,則會實現為每執行緒獨有,從而避免執行緒競爭錯誤。

4.-shared:編譯so動態庫時需要加上

-fpic:用於生成so庫。-fpic 作用於編譯階段,告訴編譯器產生與位置無關**(position-independent code),則產生的**中,沒有絕對位址,全部使用相對位址,故而**可以被載入器載入到記憶體的任意位置,都可以正確的執行。這正是共享庫所要求的,共享庫被載入時,在記憶體的位置不是固定的。(如果不加-fpic,則載入.so檔案的**段時,**段引用的資料物件需要重定位, 重定位會修改**段的內容,這就造成每個使用這個.so檔案**段的程序在核心裡都會生成這個.so檔案**段的copy.每個copy都不一樣,取決於這個.so檔案**段和資料段記憶體對映的位置. 也就是不加fpic編譯出來的so,是要再載入時根據載入到的位置再次重定位的.(因為它裡面的**並不是位置無關**) 如果被多個應用程式共同使用,那麼它們必須每個程式維護乙份.so的**副本了.(因為.so被每個程式載入的位置都不同,顯然這些重定位後的**也不同,當然不能共享) )

5.-pthread可移植性較強:在linux中,pthread是作為乙個單獨的庫存在的(libpthread.so),但是在其他unix變種中卻不一定,比如在freebsd中是沒有單獨的pthread庫的,因此在freebsd中不能使用-lpthread來鏈結pthread,而使用-pthread則不會存在這個問題,因為freebsd的編譯器能正確將-pthread展開為該系統下的依賴引數。同樣道理,其他不同的變種也會有這樣那樣的區別,如果使用-lpthread,則可能在移植到其他unix變種中時會出現問題,為了保持較高的可移植性,我們最好還是使用-pthread(儘管這種做法未被接納成為c標準,但已基本是事實標準)。)

6.-wall:開啟所有編譯警告

7.-werror:要求gcc將所有的警告當成錯誤進行處理

8.-wno-unused-function:發現不使用的函式不警告

9.-d:新增巨集定義

10.-g:生成的執行檔案執行出現問題時,可支援使用gdb定位。加上該編譯選項後,(1)建立符號表(2)關閉所有的優化機制,程式執行過程中嚴格按照c**來執行

11.-mcpu=cortex-a53:選擇處理器(

-mfloat-abi=softfp:軟浮點

-mfpu=neon-vfpv4:指定為neon+vfp結構

-fno-aggressive-loop-optimizations:避免迴圈變數的一些激進的優化

-fno-unaligned-access:非對齊訪問編譯器選項(預設arm都是aligend-access,然而如果**裡有使用__attribute__((packed))等引數定義結構體時,會出現結構體成員是pack的也就是非對齊的,此時如果沒有使能允許非對齊訪問(對結構體成員賦值等操作)會導致abort。)

-ffunction-section –fdata-sections

GCC編譯選項

gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器egcs 3.有彙編變為目標 機器 生成.o的檔案 彙編器as 4.連線目標 生成可執行程式 鏈結器ld 引數詳解 c 只啟用預處理,編譯,和彙編,也...

gcc 編譯選項

gcc 編譯選項,自己翻譯的.gcc 編譯選項,自己翻譯的.o 設定輸出檔名 c 只編譯,不連線.e 只做預編譯.pipe 在多個編譯過程之間使用管道.version 顯示版本.static 靜態連線.ansi c 模式下支援所有 iso c90 標準的 c 程式,c 模式下去除對 gnu c 擴充...

gcc 編譯選項

wall 大部分警告 wextra 一些額外的警告 werror 當出現警告時轉為錯誤,停止編譯 wconversion 一些可能改變值的隱式轉換,給出警告。wno unused parameter 函式中出現未使用的引數,不給出警告。wold style cast c風格的轉換,給出警告 wove...