【问题标题】:Visual Studio 2010 library linking orderVisual Studio 2010 库链接顺序
【发布时间】:2010-05-04 12:56:24
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    几年前,我发现了一个 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 中,可以在项目的 Configuration Properties -> Linker -> Command Line -> Additional options 下添加:

    /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
    

    【讨论】:

      【解决方案2】:

      我找到了“一个”解决方案:如果您通过#pragma comment(lib... 添加库,则链接顺序与您键入这些编译指示的顺序相同。当通过项目文件而不是通过 pragma 语句添加库时,我仍然对解决方案保持开放态度。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 我想过创建一个 DLL,但由于“其他”库是硬件加密狗保护库,我真的不想这样做:-)
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-29
          • 2012-07-03
          相关资源
          最近更新 更多