Linux下程序員均採用gcc控制編譯過程,所以我們先從gcc的編譯過程講起
gcc編譯過程分爲四個階段:
(1)預處理
(2)編譯
(3)彙編
(4)鏈接
gcc編譯工具可以控制在任何階段停止編譯,以下我們便來介紹使用
1.gcc語法格式
gcc 【編譯選項】【源文件名】
最常用的選項是 -o 生成可執行文件,如果不指定目標文件名則生成a.out
格式:gcc -o 【目標文件名】 【源文件名】
2.編譯過程控制
過程簡介:首先是預處理 ,gcc會展開源文件中的宏並向其中插入include包含的內容(生成的文件以 .i 爲後綴);
接着將預處理後的源碼編譯成目標代碼(生成的文件以 .o爲後綴,對應了上面講的編譯的(2)(3)過程);
最後將目標代碼鏈接成可執行文件(我們通常所說的elf文件,在ubuntu下是綠色的文件);
可通過編譯選項的參數控制對應過程
-E:預處理後停止編譯(.i文件)
-S:生成源文件的彙編文件(.s文件)
-c:取消鏈接,生成目標文件(.o文件)
3.關於警告的提示
-Wall:顯示所以警告信息
-w:禁止所有警告信息
4.關於庫的依賴
先簡單介紹以下庫的相關知識,Linux下的函數庫其實就是一些 .h文件 .so文件(動態鏈接庫) .a文件(靜態鏈接庫)的集合。其中.so和.a結尾的文件的最主要差別在於程序執行文件時所需要的代碼是動態加載還是在編譯時靜態加載,默認編譯採用的是動態鏈接,可以通過-shared和-static分別指定是生成動態鏈接庫還是靜態鏈接所需要的庫。
Linux下的默認庫搜索路徑有/lib、/usr/lib、/usr/lib/local/,當我們進行開發時需要添加第三方庫時就需要添加一些頭文件或者庫文件,這些都可以在編譯的時候通過編譯選項指定,下面我們就來介紹
-I【目錄名】:將指定的目錄添加到程序頭文件搜索的目錄中(大寫的i,include的意思)
-L【目錄名】:向gcc庫文件搜索路徑中添加新的目錄
-l【庫名】:包含指定的庫(小寫的l,lib的意思)
5.實例演示
以hello.c爲例子
6.代碼優化
編譯選項-O【n】(n取值範圍0,1,2,3 數值越大優化級別越高,-O等價-O1)可以優化編譯,我們採用time命令測試運行時間來舉例說明