c++ - 使用 dll 导出类时 __declspec(dllimport) 的未解析外部符号

标签 c++ visual-c++ inline dllimport dllexport

我想定义一个基于 dll 导出类的派生类。基类在Project A中定义,派生类在Project B中。

首先,在项目 A 中,定义了预处理器 MYDLL_BUILD。我使用头文件来指定导出/导入:

    #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 文件,但我仍然收到 Unresolved external symbol 错误:

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

    class __declspec(dllexport) DllObject 

解决方案编译没有错误。我真的不明白其中的原因。有人可以帮忙吗?提前致谢。

最佳答案

原因是内联。

简而言之,为了使内联函数成为可能,C++ 必须允许在多个编译单元(基本上是 .cpp 文件)中包含和编译相同的函数定义而不会导致错误。编译器可以,但不必为任何这些定义发出代码。然后允许链接器选择一个拷贝。

这会使 dll 创建变得复杂,因为您需要只导出一个拷贝,但编译器不知道哪个拷贝是正确的。在这种情况下,通过向 DllObject.cpp 添加一些代码,您可以使编译器为 DllObject 发出代码,并且链接器有一些 DllObject::~DllObject 的拷贝要导出。

我无法对您的具体情况给出更详细的解释,因为我不知道您项目的完整源代码和编译选项。

关于c++ - 使用 dll 导出类时 __declspec(dllimport) 的未解析外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9747207/

相关文章:

c++ - 对象 union 与指针 union

c++ - MSVC汇编函数自变量C++与_asm

c++ - 与 const 枚举值 0 匹配的 MSVC 函数

html - Tumblr 静态页面,删除内联 CSS

c++内联函数在GCC内联汇编中包装单个vmovups

csv - MFMailComposeViewController csv 附件没有被附加,而是显示内联

c++ - 为什么赋值运算符一开始就返回任何东西?

C++ 如何防止程序在收到 char 而不是 int 时无休止地重复输入?

c++ - 我们可以在不分配内存的情况下调用类的成员函数吗?

c++ - VC++ VS 2013,如何使用(测试)来自另一个项目的类?