2010-05-04 157 views
3

如何在Visual Studio 2010中指定鏈接庫文件的順序?Visual Studio 2010庫鏈接順序

我有一個項目,鏈接反對libexpat和另一個庫。這個庫(不在我的控制下)似乎也包含libexpat。問題在於'我們'使用了不同版本的庫(XML_UNICODE vs not)。在Visual Studio 2008中,似乎沒有問題(可能是巧合),但在Visual Studio 2010中,鏈接了libexpat的錯誤實例。我在想,如果我可以指定這兩個庫應該鏈接的順序,那麼我可以繞過這個問題。

回答

5

我發現'a'解決方案:如果通過#pragma comment(lib...添加庫,鏈接順序與鍵入這些編譯指示的順序相同。當通過項目文件而不是通過編譯指示語句添加庫時,我仍然保持解決方案的問題。

1

您可以使用第三方庫創建一個DLL並將其鏈接到它所需的expat的靜態版本,然後將您的代碼與您需要的expat版本鏈接起來。

但是,它之前的工作原理可能意味着一個庫具有另一個庫的所有功能以及一些額外的功能。我不知道expat的細節。如果是這種情況,你需要確保你只有你想要在你的庫搜索路徑中使用的版本。在其他版本的編譯器中,不同的搜索目錄順序可以解釋行爲的變化。

+0

我想過創建一個DLL,但由於'其他'庫是硬件加密狗保護庫,我不想這麼做:-) – 2010-05-04 13:17:36

0

我認爲你可以改變庫文件鏈接的順序bij將它們添加到鏈接器 - >輸入 - >附加依賴項目的項目文件中。庫文件將按照它們指定的順序進行鏈接。

7

幾年前,我發現了一個黑客,它允許您強制Visual C++以特定的優先級鏈接庫。這不是優雅的,但它是功能性的。

似乎Visual C++的鏈接器基於符號依賴關係即時生成鏈接順序。通過預先添加符號引用,您可以強制鏈接器包含鏈接器輸入中指定的第一個庫。 請注意,我只用Visual C++ 6和8(2005)進行了測試。

比方說,例如,你有兩個庫與符號XML_ParserCreate:

  • libexpat.lib - XML_ParserCreate
  • someother.lib - OtherSymbolsYouNeed,XML_ParserCreate

首先,爲了您的庫如你所期望的依賴關係,libexpat.lib然後someother.lib。通過命令行,這些將是link.exe的選項。在Visual Studio 2005中,它們將是項目配置屬性 - >鏈接器 - >輸入 - >其他依賴關係下的選項。我會想象Visual C++ 2010有一個類似的菜單。

接下來,使用/INCLUDE鏈接器選項,添加一個命令行選項,用於定義一個已知的重複符號。>鏈接 - - 在Visual Studio 2005中,這可以在該項目的配置屬性添加>命令行 - >附加選項

/out some.exe ... libexpat.lib someother.lib 
/include:XML_ParserCreate 

這個符號的定義將導致鏈接立即喜歡的第一個庫終止(實現)它。一般情況下,Visual C++會產生重複符號的錯誤;如果您還沒有,請確保您還指定了/FORCE:MULTIPLE鏈接器選項。

我的具體需求是使用DUMA內存調試庫。它定義了libcmtd.lib中定義的各種內存函數。下面會錯誤地鏈接_malloc的libcmtd的版本,儘管這似乎與此相反庫順序:

/out some.exe ... duma.lib libcmtd.lib 
/FORCE:MULTIPLE 

這是通過手動添加符號解決,並可靠地工作了多年:

/out some.exe ... duma.lib libcmtd.lib 
/INCLUDE:_malloc /FORCE:MULTIPLE