gcc/g++編譯過程閱讀筆記
-
預(yù)處理,生成.i的文件
g++ -E main.cpp > main.i預(yù)處理后不生成文件,因此需要重定向到一個文件中
-
將預(yù)處理后的文件轉(zhuǎn)換成匯編語言,生成.s文件
g++ -S main.cpp -
匯編變?yōu)槟繕?biāo)代碼(機器代碼)生成.o的文件
g++ -c main.cpp -
連接目標(biāo)代碼,生成可執(zhí)行程序
g++ main.o -o main //生成的可執(zhí)行程序名為main ,如果執(zhí)行命令 g++ main.o 這樣默認(rèn)生成a.out,也就是main與a.out是一個只是名字不同而已
那么,是在哪里實現(xiàn)”cout”函數(shù)的呢?系統(tǒng)把這些函數(shù)實現(xiàn)都被做到名為stdc++的庫文件中去了,在沒有特別指定時,g++會到系統(tǒng)默認(rèn)的搜索路徑”/usr/lib”下進(jìn)行查找,也就是鏈接到stdc++庫函數(shù)中去,這樣就能實現(xiàn)函數(shù)”cout”了,而這也就是鏈接的作用。
gcc/g++之動態(tài)靜態(tài)編譯庫函數(shù)
將這幾個文件編譯成動態(tài)庫libdynamic.so。編譯命令如下:
g++ dynamic_a.cpp dynamic_b.cpp dynamic_c.cpp -fPIC -shared -o libdynamic.so
參數(shù)說明
-shared:該選項指定生成動態(tài)連接庫
-fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關(guān)的所以動態(tài)載入時是通過代碼拷貝的方式來滿足不同進(jìn)程的需要,而不能達(dá)到真正代碼段共享的目的。
將main.cpp與libdynamic.so鏈接成一個可執(zhí)行文件main。命令如下:
g++ main.cpp -L. -ldynamic -o main
-L.:表示要連接的庫在當(dāng)前目錄中
-ldynamic:編譯器查找動態(tài)連接庫時有隱含的命名規(guī)則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱
測試可執(zhí)行程序main是否已經(jīng)鏈接的動態(tài)庫libdynamic.so,如果列出了libdynamic.so,那么就說明正常鏈接了。可以執(zhí)行以下命令:
ldd main