幾年前,我發現了一個黑客,它允許您強制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
我想過創建一個DLL,但由於'其他'庫是硬件加密狗保護庫,我不想這麼做:-) – 2010-05-04 13:17:36