我是Visual Studio C++的程序员。我在DLL中有Field、IField、Map和IMap。我创建了接口IField和IMap,以便在单元测试中访问Field和Map。当我在单元测试中运行这段简单的代码:
IMap m;
IField f(3, 4);
m.shoot(f);
我遇到了以下错误:
LNK2019 未解析的外部符号 "public: virtual __thiscall Field::~Field(void)" (??1Field@@UAE@XZ),它在函数 "public: virtual void * __thiscall Field::`scalar deleting destructor'(unsigned int)" (??_GField@@UAEPAXI@Z) 中被引用 TestShipGameDll
#pragma once
class Field
{
public:
Field(int x, int y) : x(x), y(y) {}
virtual ~Field() {}
protected:
int x;
int y;
};
.
#ifdef IFIELD_EXPORTS
#define IFIELD_API __declspec(dllexport)
#else
#define IFIELD_API __declspec(dllimport)
#endif
class IField :
public Field
{
public:
IFIELD_API IField(int x, int y) :Field(x, y)
IFIELD_API virtual ~IField() {}
};
.
class Map
{
public:
Map();
virtual ~Map();
void shoot(Field field)
{
//here is empty body of function
}
};
.
#ifdef IMAP_EXPORTS
#define IMAP_API __declspec(dllexport)
#else
#define IMAP_API __declspec(dllimport)
#endif
class IMap :
public Map
{
public:
IMAP_API IMap() {}
IMAP_API virtual ~IMap() {}
IMAP_API void shoot(Field field)
{
Map::shoot(field);
}
};
很奇怪,它看起来好像是缺少拷贝构造函数,但是在Field中我没有任何指针。只有自动变量x和y。您有什么提示来解决这个奇特的错误吗?
m.shoot(f)
将构造一个临时的Field
对象,在调用返回时需要销毁。要销毁对象,您需要使用析构函数。链接器报错,无法找到Field
的析构函数。这并不奇怪,因为它没有被导出。 - IInspectableIFIELD_API IField(int x, int y) : Field(x, y)
吗? 不过,这个方法什么时候需要暴露出来呢?谢谢 :-) - Dom