【发布时间】:2012-02-03 15:07:32
【问题描述】:
当从位于不同库中的具有相同文件名的类继承时,链接器会产生未解决的外部符号错误。想想这个继承:LIB2::MyClass : public LIB1::MyClass。
静态库“lib1”:
MyClass.h:
namespace LIB1
{
class MyClass
{
public:
MyClass();
~MyClass();
};
}
静态库“lib2”:
MyClass.h:
#include "..\MyClass.h" // Header of MyClass from lib1 somewhere else than this header file
namespace LIB2
{
class MyClass : public LIB1::MyClass
{
public:
MyClass();
~MyClass();
};
}
假设两个 .cpp 文件都存在。
lib1 中的 lib2 链接
然后一些可执行文件会尝试在 lib2 中链接并使用派生的 MyClass,比如
#include "\lib2\MyClass.h"
int main()
{
LIB2::MyClass c;
}
链接失败
错误 LNK2001: 无法解析的外部符号“public: __thiscall LIB1::MyClass::~MyClass(void)
(与ctor相同)
当我简单地将其中一个 MyClass.cpp 的文件名更改为 MyClass1.cpp 时,一切都很好。
链接器不是在 lib1.lib 中搜索 LIB1:MyClass 的定义,而是尝试在 MyClass.obj(来自 lib2)中找到它们,我怀疑。
这种行为感觉太奇怪了,不可能是故意的。我错过了什么?
此外,当在 VS2005/2010 中设置解决方案时,包括库和可执行文件,并让 VS 通过项目属性->通用属性->框架和引用设置所有库依赖项(而不是在链接器设置)链接成功。
【问题讨论】:
-
编辑:链接器不是在 lib1.lib 中搜索 LIB1:MyClass 的定义,而是尝试在 MyClass.obj 中找到它们(来自 lib2)我怀疑......对不起,忘记了,那没有没有任何意义
标签: c++ inheritance static unresolved-external