Visual Studio 2010库链接顺序

时间:2010-05-04 12:56:25

标签: c++ visual-studio-2010 static-libraries

如何在Visual Studio 2010中指定库文件的链接顺序?

我有一个链接libexpat和另一个库的项目。这个库(不在我的控制之下)似乎也包括libexpat。问题是'我们'使用不同版本的库(XML_UNICODE vs not)。在Visual Studio 2008中,似乎没有问题(可能是巧合),但在Visual Studio 2010中,libexpat的错误实例已链接。我在想如果我可以指定这两个库应该链接的顺序,那么我可以避免这个问题。

4 个答案:

答案 0 :(得分:8)

几年前,我发现了一个hack,它允许你强制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

答案 1 :(得分:5)

我找到了'a'解决方案:如果您通过#pragma comment(lib...添加库,则链接的顺序与您键入这些pragma的顺序相同。当通过项目文件而不是通过pragma语句添加库时,我仍然保持问题的解决方案。

答案 2 :(得分:1)

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

然而,它之前工作的事实可能意味着一个库具有另一个库的所有功能以及一些额外功能。我不知道外籍人士的详情。如果是这种情况,您需要确保只拥有要在库搜索路径中使用的版本。另一版本的编译器中的不同搜索目录顺序可以解释行为的变化。

答案 3 :(得分:0)

我认为您可以更改库文件链接的顺序bij将它们添加到链接器的项目文件中 - >输入 - >其他依赖项。库文件将按照指定的顺序进行链接。