代码之家  ›  专栏  ›  技术社区  ›  Randy Voet

Visual Studio 2010库链接顺序

  •  3
  • Randy Voet  · 技术社区  · 16 年前

    在visual studio 2010中,如何指定链接库文件的顺序?

    我有一个项目链接到libexpat和另一个库。这个库(不在我的控制之下)似乎也包括libexpat。问题是“我们”使用不同版本的库(xml-unicode vs-not)。在visual studio 2008中,事情似乎进展顺利(可能是巧合),但在visual studio 2010中,libexpat的错误实例被链接起来。我在想,如果我能指定这两个库的链接顺序,那么我就可以避开这个问题。

    4 回复  |  直到 14 年前
        1
  •  8
  •   Terrance    14 年前

    几年前,我发现了一个黑客,它允许您强制VisualC++将类库与特定的优先级连接起来。这不是优雅,但它是功能性的。

    看来,VisualC++的链接器基于符号依赖性在飞行中生成链接顺序。通过在前面添加符号引用,可以强制链接器包含链接器输入中指定的第一个库。 请注意,我只使用Visual C++ 6和8(2005)进行了测试。 .

    例如,假设有两个库的符号为xml parsercreate:

    • libexpat.lib-XML语法创建
    • someother.lib-需要的其他符号,XML语法创建

    首先,按预期顺序排列库依赖项,libexpat.lib,然后是someother.lib。通过命令行这些选项可以 link.exe . 在visual studio 2005中,它们是项目的 配置属性->链接器->输入->其他依赖项 . 我想VisualC++ 2010有一个类似的菜单。

    接下来,通过使用 /INCLUDE 链接器选项。在visual studio 2005中,可以在项目的 配置属性->链接器->命令行->其他选项 :

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

    此符号的定义将导致链接器立即首选终止(实现)它的第一个库。一般来说,VisualC++将用重复的符号生成错误;如果还没有,请确保还指定了 /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
    
        2
  •  5
  •   Randy Voet    16 年前

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

        3
  •  1
  •   janm    16 年前

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

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

        4
  •  0
  •   vmb100    14 年前

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