Linux下GCC使用方法簡介

來源:互聯網
上載者:User

編譯:
第一步、是進行先行編譯,使用-E參數可以讓GCC在預先處理結束後停止編譯過程:
gcc -E hello.c -o hello.i
預先處理的宏定義插入到hello.i中

第二步、是將hello.i編譯為目標代碼,這可以通過使用-c參數來完成:
gcc -c hello.i -o hello.o
也可以通過源檔案直接產生
gcc -c hello.c

第三步、是將產生的目標檔案連結成可執行檔:
gcc hello.o -o hello
也可以通過源檔案直接產生
gcc -o hello hello.c

警告:
1、-pedantic 選項,那麼使用了擴充文法的地方將產生相應的警告資訊
2、-Wall 使用它能夠使GCC產生儘可能多的警告資訊
3、-Werror,它要求GCC將所有的警告當成錯誤進行處理

庫依賴:
1、Linux下的大多數函數都預設:
標頭檔放到/usr/include/目錄下
而庫檔案則放到/usr/lib/目錄下
2、GCC在編譯時間必須有自己的辦法來尋找所需要的標頭檔和庫檔案。
-I選項可以向GCC的標頭檔搜尋路徑中添加新的目錄。
例如,如果在/home/yy/include/目錄下有編譯時間所需要的標頭檔,為了讓GCC能夠順利地找到它們,就可以使用-I選項:
gcc -o test test.c -I /home/yy/include

-L選項向GCC的庫檔案搜尋路徑中添加新的目錄
例如,如果在/home/yy/lib/目錄下有連結時所需要的庫檔案libfoo.so,為了讓GCC能夠順利地找到它,可以使用下面的命令
gcc -o test test.c -L /home/yy/lib -lfoo

值得好好解釋一下的是-l選項,它指示GCC去串連庫檔案libfoo.so。
Linux下的庫檔案在命名時有一個約定,那就是應該以lib三個字母開頭,由於所有的庫檔案都遵循了同樣的規範,因此在用-l選項指定連結的庫檔案名稱時可以省去lib三個字母,也就是說GCC在對-lfoo進行處理時,會自動去連結名為libfoo.so的檔案。

-static選項,強制使用靜態連結庫
如果在/home/yy/lib/目錄下有連結時所需要的庫檔案libfoo.so和libfoo.a
為了讓GCC在連結時只用到靜態連結庫,可以使用下面的命令:
gcc -o  test  test.c  -L /home/yy/lib  -static  -lfoo

 

編譯成動態庫:

g++  -fPIC  -shared  -o libfunc.so  func.cpp

-fPIC參數
表示編譯為位置獨立的代碼,用於編譯共用庫。目標檔案需要建立成位置無關碼,概念上就是在可執行程式裝載它們的時候,它們可以放在可執行程式的記憶體裡的任何地方。

選項-O可以告訴GCC同時減小代碼的長度和執行時間,其效果等價於-O1。
在這一層級上能夠進行的最佳化類型雖然取決於目標處理器,但一般都會包括線程跳轉(Thread Jump)和延遲退棧(Deferred Stack Pops)兩種最佳化。

選項-O2告訴GCC除了完成所有-O1層級的最佳化之外,同時還要進行一些額外的調整工作,如處理器指令調度等。

選項-O3則除了完成所有-O2層級的最佳化之外,還包括迴圈展開和其它一些與處理器特性相關的最佳化工作。

通常來說,數字越大最佳化的等級越高,同時也就意味著程式的運行速度越快。

許多Linux程式員都喜歡使用-O2選項,因為它在最佳化長度、編譯時間和代碼大小之間,取得了一個比較理想的平衡點。

time ./test 查看程式執行時間

最佳化雖然能夠給程式帶來更好的執行效能,但在如下一些場合中應該避免最佳化代碼:

程式開發的時候最佳化等級越高,消耗在編譯上的時間就越長,因此在開發的時候最好不要使用最佳化選項,只有到軟體發行或開發結束的時候,才考慮對最終產生的程式碼進行最佳化。

資源受限的時候一些最佳化選項會增加可執行代碼的體積,如果程式在運行時能夠申請到的記憶體資源非常緊張(如一些即時嵌入式裝置),那就不要對代碼進行最佳化,因為由這帶來的負面影響可能會產生非常嚴重的後果。

跟蹤調試的時候在對代碼進行最佳化的時候,某些代碼可能會被刪除或改寫,或者為了取得更佳的效能而進行重組,從而使跟蹤和調試變得異常困難。
加速:
使用管道代替編譯中臨時檔案,
-pipe 加速編譯
gcc -pipe foo.c -o foo

GCC常用選項
-c 通知GCC取消連結步驟,即編譯源碼並在最後產生目標檔案;

-Dmacro 定義指定的宏,使它能夠通過源碼中的#ifdef進行檢驗;

-E 不經過編譯預先處理程式的輸出而輸送至標準輸出;

-g3 獲得有關偵錯工具的詳細資料,它不能與-o選項聯合使用;

-Idirectory 在包含檔案搜尋路徑的起點處添加指定目錄;

-llibrary 提示連結程式在建立最終可執行檔時包含指定的庫;

-O、-O2、-O3 將最佳化狀態開啟,該選項不能與-g選項聯合使用;

-S 要求編譯器產生來自原始碼的組譯工具輸出;

-v 啟動所有警報;

-Wall 在發生警報時取消編譯操作,即將警報看作是錯誤;

-Werror 在發生警報時取消編譯操作,即把警示當作是錯誤;

-w 禁止所有的警示。

 

靜態連結

  在這種串連方式下,函數的代碼將直接拷貝到最終的可執行檔中。該程式被執行時候,會被裝入該進程的虛擬位址空間中。靜態連結庫實際上是一個或若干目標檔案。

 

動態連結

  這種方式下,函數的代碼被放到稱作動態串連庫或共用對象的某個目標檔案中。連結程式此時的工作只是在產生的可執行檔中,記錄下共用對象的名字以及少量關鍵資訊。動態串連庫可以被多個進程共用,在運行時候記憶體中只有一個執行個體。

 

二者比較

  使用動態連結能夠使可執行檔較小,並且當共用對象被多個進程使用時節省記憶體。但有時候系統運行改變或升級,不能保證動態串連庫一定可用、有效。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.