【发布时间】:2014-09-05 00:32:33
【问题描述】:
我在编译从另一个 DLL 的接口派生的类时遇到链接问题。这是代码。我有一个 c++ 接口(抽象类),在 DLL 中指定如下:
// ============================ Source DLL
// header IFace.h"
#ifdef MY_EXPORTS
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif
class MY_API IFace
{
public:
virtual ~IFace() {};
virtual bool Foo() = 0;
};
// ============================ My DLL
// header
#ifdef MY_EXPORTS22
#define MY_API22 __declspec(dllexport)
#else
#define MY_API22 __declspec(dllimport)
#endif
#include "IFace.h"
class MY_API22 MyClass_Mock : public IFace
{
// IFace
public:
virtual ~MyClass_Mock() {};
virtual bool Foo() ;
};
// cpp file
bool MyClass_Mock::Foo()
{
return true;
}
当我编译实现接口 IFace 的 DLL 时,出现链接器错误:
- 错误 LNK2019:无法解析的外部符号“__declspec(dllimport) 公共:__cdecl IFace::IFace(void)"
- 错误 LNK2019:未解决 外部符号“__declspec(dllimport) public: __cdecl IFace::IFace(类 IFace const &)"
- 错误 LNK2019:未解决 外部符号“__declspec(dllimport) public: 类 IFace & __cdecl IFace::operator=(class IFace const &)"
- 错误 LNK2001:未解决 外部符号“__declspec(dllimport) public: 类 IFace & __cdecl IFace::operator=(class IFace const &)"
当我明确定义(或在 C++11 中删除)复制 ctor 和赋值运算符时,默认 ctor 和 dtor 仍然存在错误。
我不想链接源 DLL 的 .lib 文件,因为我想稍后通过 LoadLibrary 动态加载它。如何解决此链接问题?
【问题讨论】:
-
标准 C++ 不允许您声明没有链接依赖的真正接口。您必须改用非标准的 MSVC++
__interface关键字。为此添加。 -
谢谢汉斯。它可以工作,但是对于定义宏 WIN32_LEAN_AND_MEAN 的项目,即使我的小代码 sn-p 没有来自 COM 的任何内容,它也会给出错误“错误 C2504:'IUnknown':基类未定义”。
-
嗨 Anton K,您找到解决方案了吗?我的意思是避免需要 IFace 的 dll 来编译 MyClass_Mock。谢谢
标签: c++ dll abstract-class