gpt4 book ai didi

c++ - 针对大型静态库编译时神秘的 "unresolved symbols"链接器错误

转载 作者:行者123 更新时间:2023-11-28 07:19:32 25 4
gpt4 key购买 nike

在尝试编译和链接一个较大的静态库(内部开发)时,我收到了很多奇怪的 LNK2001 和 LNK2019 错误。以下是事实:

  • 有几个静态库(大部分是内部构建的)都编译成一个大型包装静态库供公众使用(“Pimpl”成语)。本质上,我们将库 ABC 全部编译到名为 D 的内部/私有(private)库中。然后,我们有一个围绕 D 的外部/公共(public)库,称为 E
  • 最终产品不是可执行文件,而是 Adob​​e Illustrator 的插件。插件本质上只是一个具有一些特殊资源和特殊入口点(PluginMain() 函数)的 DLL。在我使用 /INCLUDE 选项指定应始终导出 PluginMain 之前,编译和链接工作得很好。
  • 创建一个插件并链接到 lib D 工作正常(没有任何错误)。创建一个插件并链接到 lib E 会产生超过 100 个 Unresolved 符号错误(应该出现在 E 中的符号)。
  • 当我在 E.lib 文件上运行 DUMPBIN 时,它似乎具有链接器在尝试时提示的所有符号创建一个插件。但是,我不完全确定我理解 DUMPBIN...
  • 的所有输出语法
  • 这些库都是跨平台的,并且可以在 Mac 上使用 GCC/LLVM 进行编译和链接。

链接器提示的大多数函数要么是普通函数,要么是静态成员函数。其中大多数看起来很像编译器可能尝试内联的函数。我已尝试禁用优化和/或自动内联,但仍然存在相同的链接错误。

任何人都可以指出一些可能解决问题的编译和/或链接设置的方向吗?在这种情况下通常配置错误的设置?

也许我错过了一个设置导致链接器在链接 E 时不导出这些符号?也许有一个设置强制链接器在链接 E 时导出 ALL 符号,我可以尝试吗?也许存在一个实用程序可以帮助我自己检查 lib 符号以获取线索?

我觉得我已经尝试了一切,但问问也无妨。谢谢大家。

编辑 1:snowdude 请求实际链接错误:

E.lib(PathArt.cpp.obj):错误 LNK2001:未解析的外部符号“private:__thiscall E::PathSegPoint::PathSegPoint(struct D::PathSegPoint const &)”(??0PathSegPoint@E @@AAE@ABU0D@@@Z)

我应该补充一点,E::PathSegPoint::PathSegPoint(const D::PathSegPoint&) 是一个私有(private)构造函数,用于构建外部/公共(public)消费类 E::PathSegPoint来自内部/私有(private) D::PathSegPoint 对象的对象。同样,这是“Pimpl”的成语。一些类/函数是 E::PathSegPoint 的 friend ,以启用这种构造。

最佳答案

我想我会发布一个答案,以防将来有人出现在这个页面上。

出于多种原因,几年前我们开始使用 Visual Studio 中的英特尔 C++ 编译器编译这些库。其中一些原因已经改变,我们需要切换回 MSVC 编译器。切换到 MSVC 编译器后,这些链接器错误消失了!

我不知道英特尔 C++ 编译器为什么或如何产生这些链接问题,但这完全有可能是一个错误。

关于c++ - 针对大型静态库编译时神秘的 "unresolved symbols"链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19714225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com