在尝试编译和链接一个有点大的静态库(内部开发)时,我收到了很多奇怪的LNK2001和LNK2019错误。以下是事实:
A
,B
和C
全部编译为名为D
的内部/私有库。然后,我们有一个外部/公共lib,它包围着D
E
。PluginMain()
函数)的DLL。编译和链接工作非常好,直到我使用/INCLUDE
选项指定始终导出PluginMain
。D
可以正常工作(无任何错误)。创建插件并链接lib E
会产生100多个未解决的符号错误(E
中应该出现的符号)。DUMPBIN
文件上运行E.lib
时, 以显示链接器在尝试创建插件时抱怨的所有符号。但是,我并不完全确定我理解DUMPBIN
... 链接器抱怨的大多数函数都是普通函数或静态成员函数。其中大多数看起来像编译器可能尝试内联的功能。我尝试过禁用优化和/或自动内联,但仍然存在相同的链接错误。
有人能指出我可能解决问题的某些编译和/或链接设置的方向吗?在这种情况下通常配置错误的设置?
也许我错过了一个设置,导致链接器在链接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
的朋友,可以实现这种构造。
答案 0 :(得分:1)
我想我会发布一个答案,以防将来有人出现在这个页面上。
几年前,我们开始使用Visual Studio中的英特尔C ++编译器编译这些库。其中一些原因已经改变,我们需要切换回MSVC编译器。切换到MSVC编译器后,这些链接器错误消失了!
我不知道英特尔C ++编译器为何或如何开发这些链接问题,但这完全有可能是一个错误。