0

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

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

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

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

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

我觉得我什么都试过了,但问起来总不会有什么坏处。谢谢大家。

编辑 1: snowdude 请求了一个实际的链接错误:

E.lib(PathArt.cpp.obj) : error LNK2001: unresolved external symbol "private: __thiscall E::PathSegPoint::PathSegPoint(struct D::PathSegPoint const &)" (??0PathSegPoint@E@@AAE@ABU0D@@@Z)

我应该补充一点,这是一个私有构造函数,用于从内部/私有对象E::PathSegPoint::PathSegPoint(const D::PathSegPoint&)构造一个外部/公共消耗对象。同样,这是“Pimpl”成语。一些类/函数是启用这种构造的朋友。E::PathSegPointD::PathSegPointE::PathSegPoint

4

1 回答 1

1

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

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

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

于 2013-11-06T17:13:26.443 回答