【问题标题】:Howto handle C++ static lib dependencies of third party static library如何处理第三方静态库的 C++ 静态库依赖
【发布时间】:2021-08-27 03:55:03
【问题描述】:

有人可以解释为什么我在以下设置中遇到 LINK-Errors:

我有一个静态 C++ MyOwnLib.lib,它使用了一些静态第三方 LibA.lib、LibB.lib、LibC.lib。只有 MyOwnLib.lib 使用了这个第三方库的一些实现,因此我在 MyOwnLib.cpp 文件中 #include 了所有第三方库,而不是 MyOwnLib。 h 文件。

现在: 当我构建 MyOwnLib.lib 时,它的工作没有错误。

但是,当我使用/链接 MyOwnLib.lib 到我的 Tool.exe 项目时,我得到了属于第三方库的方法/类型的 LINK 错误,尽管我只使用了MyOwnLib.cpp 文件。

我什至没有在我的 Tool.exe 项目中使用任何第三方方法。

我发现:还有一些属于我使用的第三方库的 .lib 文件,我真的不需要,但只要我将它们链接到 MyOwnLib.lib ,我的 Tool.exe 项目中不再出现 LINK 错误。然而,这个“不需要的库”使 MyOwnLob.lib 非常大,我实际上想避免这种情况。

我正在寻找类似的问题,但没有找到解释。

更新: 我刚刚发现,使用 pIndom 前向声明的类可以使用第三方库的类型/方法,并且即使我做了 not 链接 any 也会正确构建/编译图书馆。

为什么会这样?如果我在普通类中使用类型/方法,我会得到预期的 LINK 错误。 ?

谢谢

【问题讨论】:

  • 可能不是很有帮助的提示:这可能意味着 MyOwnLib.lib 不包含它的所有依赖项。
  • 如果您遇到链接错误,那么这些库的部分将在您的Tool.exe 中以某种方式使用,例如通过包含的标头中的一些依赖项。
  • 我也是这么想的,但我的 Tool.exe 项目中没有包含与任何第三方库文件相关的内容。

标签: c++ static-libraries static-linking


【解决方案1】:

在链接时,普通链接器会尝试解析任何符号,无论它们是否会被实际使用。如果缺少一些,它会列出它们并中止构建。

如果您确实确定它们永远不会被使用,一个可能的技巧是提供一个存根,将所有这些缺失的符号定义为指向 void 或 void 函数的指针,并将其添加到您的构建中。对于链接器来说,这应该足够了。

如果您不希望您的应用程序在没有任何消息的情况下崩溃,您可以尝试更聪明一点,并使用正确的签名定义所有函数或方法,以发出错误消息并快速失败。应用程序确实会被破坏,但至少你会知道问题出在哪里。

【讨论】:

  • 谢谢,但是为什么 MyOwnLib.lib 的构建和编译有效,并且在将 MyOwnLib.lib 链接到我的 Tool.exe 项目后,它给了我所用第三方的类型/方法的 LINK 错误库?
  • 更新: 我刚刚发现,使用 pIndom 前向声明的类可以使用第三方库的类型/方法,即使我这样做了也会正确构建/编译链接任何库。为什么这行得通?如果我在普通类中使用该库的类型/方法(未前向声明),我会按预期得到 LINK 错误。 ?
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
相关资源
最近更新 更多