gcc 編譯原理

gcc 編譯原理

以前寫C/C++程序都是在windows下面用VS完成的,程序的編譯過程IDE都替你完成了,雖然對初學者來說很容易上手,但是它也掩蓋了程序編譯鏈接的原理,如果不瞭解這些的話,那麼只會停留在入門階段,不會對程序有更深的理解。而且更重要的是,很多優秀的開源項目都是用make或cmake編譯,因此,瞭解Linux平臺下的編譯工具gcc是很有必要的。本文簡要介紹gcc編譯的過程的使用方法。

1 一步生成可執行程序
如有一個文件:test.c, 執行如下命令:
gcc test.c -o test
可一步到位生成可執行程序 test. 但實際上包含了四個步驟:
在這裏插入圖片描述
當然,以上步驟也可以分步完成。

2 預處理
預處理就是將要包含(include)的文件插入原文件中、將宏定義展開、根據條件編譯命令選擇要使用的代碼,最後將這些代碼輸出到一個“.i”文件中等待進一步處理
gcc -E test.c -o test.i

3 編譯
c代碼 --> 彙編代碼
gcc -S test.i -o test.s

4 彙編
彙編代碼 --> 機器碼
gcc -c test.s -o test.o

5 鏈接
鏈接就是將彙編生成的OBJ文件、系統庫的OBJ文件、庫文件鏈接起來,最終生成可以在特定平臺運行的可執行程序
gcc test.o -o test

參考:
https://blog.csdn.net/czg13548930186/article/details/78331692
https://www.cnblogs.com/mingcaoyouxin/p/4282522.html

6 gcc 編譯常見的編譯選項

-I: 將目錄dir添加到要搜索的目錄列表中以查找頭文件。在標準系統包含目錄之前,搜索由‘-i’命名的目錄
-Wall: 選項意思是編譯後顯示所有警告。
-fPIC: 生成與位置無關的代碼,適用於動態庫編譯
-fopenmp: 啓用openmp的#pragma指令
-Dxxx: 預定義宏xxx
-Ofast: 無視嚴格的標準
-O0: 減少編譯時間,使調試產生預期的結果。這是默認的
-g: 以操作系統的本機格式生成調試信息(TAPS、COFF、XCOFF或DUF 2) gdb可以使用此調試信息
-pthread: 添加對多線程的支持。此選項爲預處理器和鏈接器設置標誌
`pkg-config --cflags opencv` : 調用pkg-config工具獲取本機上opencv的include目錄選項
`pkg-config --libs opencv` : 調用pkg-config工具獲取本機上opencv的動態庫鏈接選項。

pkg-config原理參考: https://www.cnblogs.com/chris-cp/p/3580002.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章