g++基礎使用以及如何生成靜態鏈接庫和動態鏈接庫

 

參考:https://blog.csdn.net/woshinia/article/details/11060797?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

.cpp .c ->預處理 -> 編譯成彙編語言 ->彙編成目標文件 ->連接成可執行文件

g++ :

-E : 只做預處理,得到.i文件

-S :編譯,得到的文件是彙編語言文件 .s

-c :彙編成目標文件 .o

-L :連接

-o :後面加輸出的文件名(-o可以穿插在g++指令中的任何一個位置,在文件前面,後面,或者兩個文件中間)

不加參數的話就是完成上述所有過程(預處理、編譯、彙編、連接),如果需要連接的話,後面可以跟多個文件。最後生成可執行文件。一般用-o指定文件名,如果沒有指定,會生成同名的.out文件

注意大小寫

1.預處理,生成.i的文件[預處理器cpp]

命令:g++ -E Test.cpp 如果想把預處理後的文件保存出來到文件可以在後面加上 > Test.i(輸出重定向)或者 -o Test.i

功能:輸出預處理後的文件,linux下以.i爲後綴名。只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件裏 。這一步主要做了這些事情:宏的替換,還有註釋的消除,還有找到相關的庫文件。用編輯器打開Test.i會發現有很多很多代碼,你只需要看最後部分就會發現,預處理做了宏的替換,還有註釋的消除,可以理解爲無關代碼的清除。下面是Test.i文件的最後部分,可以看見宏的替換和註釋的消除。

 

2.將預處理後的文件不轉換成彙編語言,生成文件.s[編譯器egcs]

命令:g++ -S Test.cpp (-o Test.s)

功能:會生成Test.s文件,.s文件表示是彙編文件,用編輯器打開就都是彙編指令。

 

3.有彙編變爲目標代碼(機器代碼)生成.o的文件[彙編器as]

命令:g++ -c Test.cpp  (-o Test.o)

功能:.o是GCC生成的目標文件,除非你是做編譯器和連接器調試開發的,否則打開這種.o沒有任何意義。二進制機器碼一般人也讀不了。

 

4.連接目標代碼,生成可執行程序[鏈接器ld]

命令:g++ Test.o -L F:\vs2008\VC\include\iostream

功能:將.o文件與所需的庫文件鏈接整合形成.exe文件,這就是可執行文件。-L 表示鏈接,這裏我後面寫的是絕對路徑,相對各人電腦不同

 

在上面各個步驟中你可以用-o命令輸出你自己想要的各種名字。比如最後一個命令,用下面的輸出Test.exe

你可以g++ Test.o -o Test.exe -L F:\vs2008\VC\include\iostream

 

5.執行

./ Test.exe

 

 

1.如果只有一個文件,且不需要庫文件,則可以直接生成可執行文件

g++ -o main main.cpp

2.如果需要把文件編譯庫文件

無論是靜態庫文件還是動態庫文件,都是由 .o 文件創建的,所以第一步先編譯成.o目標文件

庫文件的命名規範是以 lib 開頭(前綴),緊接着是後綴名,靜態鏈接庫以 .a 爲後綴名 ,動態鏈接庫以.so爲後綴名

(1)動態鏈接庫

例一;

g++ -fPIC -o math.o -c math.cpp

g++ -shared -o libmath.so math.o

也可以直接一條命令搞定:

g++ -fPIC -shared -o libmath.so math.cpp

例二:

g++ fPIC -o add.o -c add. cpp

g++ fPIC -o sub.o -c sub.cpp

g ++ -shared -o libmymath.so add.o sub .o

也可以直接一條命令搞定:

g++ -fPIC -shared -o libmymath.so add.cpp sub.cpp

-fPIC :表示編譯爲位置獨立的代碼。 不用此選項的話編譯後的代碼是位置相關 的,所以動態載入時是通過代碼複製的方式 來滿足不同進程的需要,而不能達到真正代 碼段共享的目的。

(2)靜態鏈接庫

g++ -c math.o math.cpp

用ar工具:

av -cr libmath.a math.o

ar命令的 r選項:在庫中插入模塊(替換)。 當插入的模塊名已經在庫中存在,則替換同名的模塊。 如果若干模塊中有一個模塊在庫中不存在, ar 會顯示一個錯誤消息,並不替換其 他同名模塊。 默認的情況下,新的成員增加在庫的結尾處,可以使用其他任選項來改變增加 的位置。

ar 命令的 c 選項:創建一個庫。不管庫是否存在,都將創建。

(3)使用庫文件

靜態庫:g++ -o main main.cpp -L libmath.a 這樣main.cpp文件中可以使用libmath.a庫中的函數

動態庫:方法相同

 

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