cpp文件中具有琐碎定义的虚拟函数导致链接器错误
Virtual functions with trivial definitions in cpp file causing linker errors
所以,我有两个项目,项目2构建到一个dll中,我有这个类(头和cpp后面)
标题
class classWvirts
{
public:
classWvirts(){};
~classWvirts(){};
virtual int testVirtualFunction();
};
cpp
#include "classWvirts.h"
int classWvirts::testVirtualFunction()
{
return 1;
}
在项目1(构建为exe)中,我只有一个.cpp文件,如下所示:
#include "../testApp2/classWvirts.h"
classWvirts obj1;
int main()
{
obj1.testVirtualFunction();
}
这个设置似乎具备了它工作的所有要素,尽管我的方法被标记为虚拟的,但它的cpp文件中有一个琐碎的定义。
然而,当我试图编译它时,我得到了一个LNK2001链接器错误,看起来像
错误1错误LNK2019:未解析的外部符号"public:virtual int __thiscall classWvirts::testVirtualFunction(void)"(?testVirtualFunction@classWvirts@@UAEHXZ)在函数_main E:\Work\Scratch\US1212_Virt\testApp\testApp\Source.obj testApp 中引用
有人能指出我做错了什么吗?我意识到,如果我把琐碎的定义放在头文件中,一切都会工作,但如果这不是一个选项呢?(这显然是我在一个更大项目中遇到的问题的简化版本),可能有空间将cpp制作成inl并将其包含在标头中,但我宁愿避免这种情况,并保持cpp和标头的区别。
使用Visual Studio编译器制作DLL时,必须通过在库中用__declspec(dllexport)
声明从DLL库导出类
class __declspec(dllexport) classWvirts
{
...
您必须通过在主项目中用__declspec(dllimport)
声明它,将其导入到您的主项目中
class __declspec(dllimport) classWvirts
{
为了在导入和导出中使用相同的头文件,可以引入宏
#define MY_DLL_IMPORT_EXPORT ...
class MY_DLL_IMPORT_EXPORT classWvirts
{
...
在编译DLL时,您将其定义为__declspec(dllexport)
,在所有其他情况下(即编译主项目时),您将定义为__declspec(dllimport)
。
如果您在DLL项目上创建主项目的依赖项,Visual Studio应自动处理其他链接器设置(即,它将自动将主项目与DLL的导入库链接)。如果您没有该依赖项,请创建该依赖项或在主项目的链接器设置中手动指定DLL导入库。
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 如何在C++中伪造虚拟可变参数函数模板?
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 虚拟继承基构造函数消除
- "虚拟""覆盖"析构函数
- 类中的虚拟布尔函数参数不起作用
- 用纯虚拟函数兜圈子
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- 尝试在 QLabel 上绘画失败(无法在没有对象的情况下调用成员函数"虚拟无效 QLabel::p aintEvent(QPaintEvent*)")
- 声明析构函数虚拟就足够了吗?
- 视觉 C++当我们在基类中使函数成为纯虚拟时,那么在子类中再次使相同的函数虚拟的必要性是什么
- 重载函数(虚拟/非虚拟)