c 的 o檔案的鏈結順序

2021-09-06 19:55:19 字數 2292 閱讀 2706

linker對鏈結順序要求很嚴格,如果順序有誤,多半就會報undefined reference to ******的錯誤

檔案目錄:

顯然,main.cpp 通過 test.h 引用 test.cpp 的 implementation 。 說人話? 好吧 。。。 具體來說就是linker在發現main.cpp 中的 test::testliftoff() 呼叫的時候, 需要去找test::testliftoff()的implementation,去哪找?當然是test.cpp中,編譯為obj檔案後,其實就是main.o 依賴於 test.o我們把這種關係描述為main.o < test.o類似的還有test.o < liftoff.otest.o總的原則就是:如果a.o依賴於b.o,那麼在linker命令中,a.o必須在b.o的左邊(可以不相鄰)

g++ -o test.exe main.o test.o liftoff.o -s zthread_win32.a // linker command 1
其實,只要順序不違反上面的關係定義,後面的順序是可以任意調整的,例如,實際上liftoff.o與-s zthread_win3.a的順序調一下也是可以的

g++ -o test.exe main.o test.o -s zthread_win32.a liftoff.o // linker command 2
總結:

你編譯上面的**為:

g++ -c *.cpp
鏈結的時候上面給出的linker command 1、linker command 2任意選乙個都行

另外:事實上,在linux下,由於zthread依賴於posix thread library,在 -s zthread_***.a之後還需要-lpthread來載入posix thread library,也是這個原因,見這篇隨筆

linux 下的 a 檔案 o 檔案 含義

o 就是object,也就相當於windows下編譯的obj檔案,俗稱目標檔案.a 就是archive,也就相當於windows的vc下編譯的lib檔案,俗稱靜態庫檔案.o檔案是鏈結檔案,a是靜態庫檔案,靠.o檔案生成,作為乙個庫為外部程式提供函式,介面。生成.o檔案 gcc c test.o te...

C 標頭檔案的包含順序

一 google c 程式設計風格指南 裡的觀點 dir2 foo2.h preferred location see details below c system files.c system files.other libraries h files.your project s h files...

gcc編譯鏈結時標頭檔案和庫檔案的搜尋順序

編譯 找符號定義 執行 執行 靜態庫鏈結時直接寫程序式裡了 編譯時搜尋標頭檔案的順序 1 gcc先找 i設定的路徑 2 再找gcc的環境變數c include path,cplus include path,objc include path設定的路徑 3 最後再找內定目錄 usr include ...