Visual Studio 2010库链接顺序

5
在Visual Studio 2010中,如何指定库文件链接的顺序?
我有一个项目,它链接到libexpat和另一个库。这个库(不在我的控制范围内)似乎也包含libexpat。问题是,“我们”使用库的不同版本(XML_UNICODE与否)。在Visual Studio 2008中,事情似乎还好(可能是巧合),但在Visual Studio 2010中,链接了错误的libexpat实例。我想,如果我可以指定这两个库链接的顺序,那么我就可以避开这个问题。
4个回答

12
几年前,我发现了一种方法,可以强制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 中定义。以下内容将错误地链接到 libcmtd 的 _malloc 版本,尽管库顺序似乎相反:
/out some.exe ... duma.lib libcmtd.lib
/FORCE:MULTIPLE

这个问题是通过手动添加符号解决的,并且多年来一直可靠工作:
/out some.exe ... duma.lib libcmtd.lib
/INCLUDE:_malloc /FORCE:MULTIPLE

7
我找到了“一个”解决方案:如果你通过#pragma comment(lib...添加库,链接顺序将与你键入这些#pragma的顺序相同。但是,如果库是通过项目文件而不是通过#pragma语句添加的,则我仍然需要寻找解决方案。

1

您可以使用第三方库创建一个DLL,并将其链接到所需的静态版本expat,然后将您的代码链接到您需要的expat版本。

但是,它之前能够工作可能意味着一个库具有另一个库的所有功能以及一些额外的功能。我不知道expat的详细信息。如果是这种情况,您需要确保在您的库搜索路径中仅有您想要使用的版本。编译器的其他版本中不同的搜索目录顺序可能解释了行为上的变化。


我曾考虑过创建一个DLL,但由于“其他”库是硬件加密狗保护库,所以我不想这样做 :-) - Randy Voet

0

我认为你可以通过在项目文件中的链接器 -> 输入 -> 附加依赖项中添加它们来更改库文件链接的顺序。库文件将按照指定的顺序进行链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接