如何处理第三方静态库的C++静态库依赖

时间:2021-06-10 06:50:27

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

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

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

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

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

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

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

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

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

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

谢谢

1 个答案:

答案 0 :(得分:0)

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

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

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