我想基于一个导出类定义一个派生类。基类已在项目A中定义,而派生类则在项目B中。首先,在项目A中,预处理器MYDLL_BUILD已被定义。我使用了一个头文件来指定导出/导入:
然后我定义基类:
在项目B中,预处理器MYDLL_BUILD未定义。这是派生类:
我已经包含了dll和lib文件,但是我仍然遇到未解决的外部符号错误:
我在网上搜索,大多数答案声称缺少库。但这些说明并没有解决我的问题。
当我更改时......
这个解决方案编译没有错误。我真的不明白原因。有人可以帮忙吗?先谢谢了。
#if !defined(MYDLL_BUILD)
# pragma comment(lib, "myDll.lib")
#endif
#if defined(MYDLL_BUILD)
# define MYDLL_API __declspec(dllexport)
#else
# define MYDLL_API __declspec(dllimport)
#endif
然后我定义基类:
class MYDLL_API DllObject
{
public:
virtual ~DllObject() {}
protected:
DllObject() { m_count = 3; }
private:
int m_count;
};
在项目B中,预处理器MYDLL_BUILD未定义。这是派生类:
class MyClass : public DllObject
{
public:
~MyClass(){}
MyClass() { m_data = 20; }
private:
int m_data;
};
我已经包含了dll和lib文件,但是我仍然遇到未解决的外部符号错误:
2>Test_Entry.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall ADAI::DllObject::~DllObject(void)" (__imp_??1DllObject@ADAI@@UAE@XZ) referenced in function "public: virtual __thiscall MyClass::~MyClass(void)" (??1MyClass@@UAE@XZ)
2>Test_Entry.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) protected: __thiscall ADAI::DllObject::DllObject(void)" (__imp_??0DllObject@ADAI@@IAE@XZ) referenced in function "public: __thiscall MyClass::MyClass(void)" (??0MyClass@@QAE@XZ)
2>c:\Users\Adai\Documents\Visual Studio 2010\Projects\Test_Main\Debug\Test_Main.exe : fatal error LNK1120: 2 unresolved externals
我在网上搜索,大多数答案声称缺少库。但这些说明并没有解决我的问题。
当我更改时......
class MYDLL_API DllObject
to
class __declspec(dllexport) DllObject
这个解决方案编译没有错误。我真的不明白原因。有人可以帮忙吗?先谢谢了。
MYDLL_API
没有按照你的期望在项目 A 中被定义。让 VS 生成一个预处理版本的 DllObject 文件(右键单击文件,转到属性,展开 C/C++ 并查看预处理器选项)。确保输出包含class __declspec(dllexport) DllObject
而不是class __declspec(dllimport) DllObject
。 - PraetorianUNICODE
宏编译,但链接到它的可执行文件没有使用该宏。 - Mooing Duck