2010-05-04 123 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