【问题标题】:Linking static libraries in visual studio with composite dependencies将 Visual Studio 中的静态库与复合依赖项链接
【发布时间】:2010-11-24 16:10:25
【问题描述】:

假设您有两个静态库 A 和 B,这样 A 引用 B 中的方法。是否可以将可执行文件静态链接到 A 和 B,这样 A 引用的 B 中就没有未解析的符号?

这是我的情况:

当我尝试在 Visual Studio 2010 中以这种方式链接所有内容时,A 和 B 之间存在未解析的符号。但应用程序和 A 之间没有。它抱怨的符号具有 __imp 前缀(它没有,并且不应该存在于 B 的 DUMPBIN 中)。即使没有一个库是作为 DLL 构建的并且我在所有项目中都包含了所有必需的“附加库依赖项/目录”,为什么还要寻找带有 __imp 前缀的符号?此外,一切都是用完全相同的编译器构建的。

编辑:如果库 B 构建为带有导入库而不是静态库的 DLL,则所有内容都将正确链接,这可能会有所帮助。

编辑:我几乎可以肯定这不是导致 declspec() 或其他原因的预处理器条件,因为当应用程序使用 B 时没有链接器错误。就在 A 使用 B 时。

回答:Edwin 和 JimR 都是正确的,实际上在标头中使用了一个宏导致了 declspec,但是当他们第一次提到这种可能性时,我太固执了,没有注意到它。感谢大家的耐心等待。

【问题讨论】:

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


    【解决方案1】:

    依赖项应该无关紧要!它们甚至可能是循环的,就像 A refs B 和 B refs A 一样。在我看来(因为你得到链接器错误)要么你没有这些库的头文件(你是在 B 中手动声明 funcs 还是 funcs来自 A 中的 B)或头文件在您的程序和库中的编译方式不同(由于某些 #define 或编译器选项)。你在 prog 和 libs 中使用相同的调用约定吗?

    【讨论】:

    • 我包含了所有头文件,所有方法都使用相同的调用约定,并且没有 dllexport/dllimport 正在进行。如果有的话,我会期望看到 A 引用 __imp 符号,因为那样它实际上会存在于 B 的符号表中。
    • 您可以尝试对有问题的库的文件进行预处理并搜索您的症状。这可能会直接指出问题所在。
    • 您的编辑意味着 lib A 对 B 的使用与您的程序对 B 的使用不同。对文件进行预处理可以让您了解包含标题时的不同之处。
    • +1 到第二条评论,如果我按照你的建议进行预处理,我会节省很多时间 :)
    • @insipid : 很高兴我能提供帮助
    【解决方案2】:

    我没有 MSVS 2010 可供查看,因此请谨慎对待。

    如果符号名称中有 imp,这意味着要么有一个 declspec(dllimport) 在某处浮动,一个(可能嵌入在代码中)编译器开关强制 A 将 B 视为 DLL或者您正在链接旧的东西,而不是构建过程当前正在生成的东西。

    您使用的项目是从旧版本的 MSVS 导入的吗?我在几年前导入 MSVS 2008 的一个管理不善的项目中遇到了类似的问题......

    无论哪种方式,请仔细检查 A 的构建环境,并确保您寻找嵌入编译器/链接器开关的编译指示。

    【讨论】:

      【解决方案3】:

      由于您之前将 lib B 用作 DLL,因此当您构建 lib A 时,您的 lib B 仍然是一个 DLL,而当您将 lib 更改为库时,您忘记了重新构建 A。

      【讨论】:

      • +1 好建议,但自从将 B 更改为静态后,我已经多次重建 A。
      • 好的,但是你有一个额外的库路径到你的库,或者你是否将你的库复制到你的 lib-search-path 中的一个地方而忘记了它。甚至这两种东西,仍然存在首先找到的旧版本。
      猜你喜欢
      • 2014-11-22
      • 2017-06-21
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多