在基于插件的C ++项目中,我有一个TmpClass
,用于在主应用程序和插件之间交换数据。因此,相应的TmpClass.h
包含在主应用程序项目包含的抽象插件接口类中,并由每个插件实现。
由于插件处理TmpClass
个实例的STL向量,因此需要TmpClass
的默认构造函数和析构函数。我在TmpClass.h
中声明了这些:
class TmpClass {
TmpClass();
~TmpClass();
}
并在TmpClass.cpp
中实施。
TmpClass::~TmpClass() {}
TmpClass::TmpClass() {}
然而,在编译插件时,这导致链接器抱怨两个未解析的外部 - TmpClass
模板实例化所需的std::vector<TmpClass>
的默认构造函数和析构函数 - 即使我声明的所有其他函数TmpClass.h
并在TmpClass.cpp
工作中实施。只要从.cpp文件中删除(空)默认构造函数和析构函数并将它们内联到.h文件中的类声明中,插件就会编译并运行。
为什么默认构造函数和析构函数具有内联以便编译此代码?为什么它甚至会破坏? (我正在使用MSVC ++ 8)。
答案 0 :(得分:2)
您描述的行为仅表示您忘记将TmpClass.cpp
文件包含在项目中。
编译器不能也不会神奇地知道定义非内联类方法的位置。您有责任编译所有.cpp
个文件并将它们链接在一起。在MSVC中,通常通过将所有.cpp
文件添加到项目中来完成。
答案 1 :(得分:0)
我猜你有一个“主应用程序”项目和一个或多个“插件”项目,看起来你没有在插件项目中包含TmpClass.cpp。我也猜测“你在.h中声明的所有其他函数和.cpp中的实现”仅由你的主项目而不是你的插件使用。
正如其他人所说,你可以在你的插件项目中包含TmpClass.cpp。另一种选择是创建一个dll“sdk”项目,并将main和plugins项目链接到它。
如果您仍然认为这和AndreyT的答案有误,您应该提供有关项目结构的更多信息。