VS C++ DLL - 标量删除析构函数

3

我是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 的析构函数。这并不奇怪,因为它没有被导出。 - IInspectable
为什么连接器没有对 "Field" 的构造函数报错呢? 是因为初始化列表 IFIELD_API IField(int x, int y) : Field(x, y) 吗? 不过,这个方法什么时候需要暴露出来呢?谢谢 :-) - Dom
有史以来最模糊的答案...我遇到了类似的错误,通过将析构函数声明为“虚拟”的方式解决了它,更多细节请参见此处:https://dev59.com/z47ea4cB1Zd3GeqPG96P#32444685 - Felipe
1个回答

0

你必须使用IFIELD_API导出整个类 - 否则编译器生成的函数在共享库外部不可见,会导致链接错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接