2012-09-05 56 views
0

我正在一個非常大的項目,有幾個Visual Studio項目。這些項目構建爲靜態庫幷包含在Main項目中,我們稱之爲Main.exe鏈接對兩個靜態庫

我創建了一個新項目並將其構建爲一個靜態庫,我們將其稱爲MyProj.lib。這個庫依賴於另一個靜態庫,我們稱之爲API.lib

現在,我需要將我的項目鏈接到主項目。目前我有兩個靜態庫鏈接到主項目。我以前問過這個問題:Link static library in another static library,發現我無法嵌套靜態庫。 Paul Michalik指出,當我構建主項目時,我需要單獨鏈接兩個庫。

我現在從MyProj.lib庫中得到幾個LNK2019錯誤,說它找不到在API.lib庫中定義的符號。 Visual Studio知道兩個庫文件都在哪裏,所以這對我來說非常混亂。有任何想法嗎?

回答

2

這種混淆源於錯誤的認爲.lib文件有點神奇。鏈接器可能請參閱 .lib文件具有其他依賴關係。情況並非如此,靜態的.lib只是一包.obj文件。一種將編譯器輸出收集到單個文件的方法。沒有更多,沒有更多。

什麼是特別令人困惑的是,當你建立圖書館,它不會抱怨失蹤的依賴關係。對此的解釋很簡單,建立一個庫不是而是運行鏈接器。只需將收集.obj文件的lib.exe工具放入包中即可。

直到您真正運行鏈接器來構建最終的可執行文件時,它纔會聚集在一起。現在所有作品必須彙集在一起​​,鏈接器也有也可以查看包含依賴關係的.obj或.lib文件。它沒有時抱怨。

這是C/C++構建模型中很薄弱的一個環節,很難修復。供應商試圖解決這個問題,微軟也這樣做。他們添加了非標準的#pragma註釋(lib,「something.lib」)來告訴鏈接器它需要鏈接「something.iib」,而不必在鏈接器的Additional Dependencies設置中明確指定它。非常好。正確處理,其中「something.lib」存儲是您需要處理的問題。污物。另一個設置。

1

最簡單的解決方案是簡單地將.lib文件添加到依賴它們的每個項目中。萬一它很重要(它可能不適用於VS),將依賴庫放在依賴庫之前。

(可能的)缺點是這些庫在更改時不會自動重新編譯。

+0

你是說將'API.lib'鏈接到'MyProj.lib'並鏈接兩個主項目?我試過了,它給了我大約3600+鏈接器警告。 – Derek

+0

@ Derek:如果MyProj.lib *包含* API.lib,就會發生這種情況。但MyProj應該只包含對API的外部引用以及其他任何內容,而不是引用的模塊和符號。 – wallyk

+0

好吧,我想我跟着你。現在'MyProj.lib'正在構建爲一個庫,而不連接到'API.lib'。 – Derek