簡體   English   中英

鏈接到兩個靜態庫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM