编译大型静态lib时出现神秘的“未解析符号”链接器错误

时间:2013-10-31 18:39:37

标签: c++ visual-studio-2010 visual-c++ linker

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

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

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

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

也许我错过了一个设置,导致链接器在链接E时不导出这些符号?也许有一个设置强制链接器在链接E时可以尝试导出 ALL 符号?也许有一个实用程序可以帮助我自己检查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&)是一个私有构造函数,用于从内部/私有E::PathSegPoint对象构造外部/公共可使用的D::PathSegPoint对象。再次,这是“Pimpl”的成语。某些类/函数是E::PathSegPoint的朋友,可以实现这种构造。

1 个答案:

答案 0 :(得分:1)

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

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

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