[英]Link against two static libraries
我正在處理一個具有多個Visual Studio項目的大型項目。 這些項目被構建為靜態庫,並包含在Main項目中,我們稱其為Main.exe
。
我創建了一個新項目並將其構建為靜態庫,我們將其MyProj.lib
。 這個庫依賴於另一個靜態庫,我們稱它為API.lib
。
現在,我需要將我的項目鏈接到Main項目。 目前,我有兩個鏈接到Main項目的靜態庫。 我之前曾問過這個問題:將靜態庫鏈接到另一個靜態庫中 ,發現我無法嵌套這些靜態庫。 Paul Michalik指出,在構建Main項目時,我需要簡單地將兩個庫獨立鏈接。
我現在從MyProj.lib
庫中收到幾個LNK2019
錯誤,說它找不到API.lib
庫中定義的符號。 Visual Studio知道兩個庫文件都在哪里,所以這讓我感到非常困惑。 有任何想法嗎?
造成這種混淆的原因是,人們錯誤地認為.lib文件具有魔力。 鏈接器可以看到 .lib文件具有其他依賴關系。 事實並非如此,靜態.lib只是一袋.obj文件。 一種將編譯器輸出收集到單個文件中的方法。 僅此而已。
特別令人困惑的是,在構建庫時,它永遠不會抱怨缺少依賴項。 造成這種情況的原因很簡單,建立一個庫不運行鏈接器。 只是將.obj文件收集到袋子中的lib.exe工具。
直到您實際運行鏈接器以生成最終的可執行文件時,它們才會結合在一起。 現在所有部分都必須整合在一起,鏈接器還必須查看包含依賴項的.obj或.lib文件。 如果沒有,它會抱怨。
在C / C ++構建模型中,這是一個非常薄弱的環節,很難修復。 供應商試圖解決這個問題,微軟也這樣做。 他們添加了非標准的#pragma comment(lib,“ something.lib”)功能,以告知鏈接器它需要鏈接“ something.iib”,而無需在鏈接器的“其他依賴項”設置中明確指定。 非常好。 有什么地方 “something.lib”存儲處理然而你需要處理的問題。 克魯德。 另一個設置。
最簡單的解決方案是將.lib
文件簡單地添加到每個依賴它們的項目中。 如果很重要(對於VS可能不重要),請將依賴庫放在依賴庫之前。
(可能的)缺點是庫更改時不會自動重新編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.