gcc/g++編譯過程

gcc/g++編譯過程閱讀筆記

  1. 預(yù)處理,生成.i的文件

    g++ -E main.cpp > main.i 
    

    預(yù)處理后不生成文件,因此需要重定向到一個文件中

  2. 將預(yù)處理后的文件轉(zhuǎn)換成匯編語言,生成.s文件

    g++ -S main.cpp
    
  3. 匯編變?yōu)槟繕?biāo)代碼(機器代碼)生成.o的文件

    g++ -c main.cpp 
    
  4. 連接目標(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容