我如何在我的C DLL中修复未解决的外部符号错误

How do I fix an Unresolved External Symbol error in my C++ DLL?

本文关键字:未解决 外部 错误 符号 我的 DLL      更新时间:2023-10-16

我有一个DLL,它可以在其项目之外访问某些类(我正在使用Visual Studio,所以我有两个项目)。事实是,在标题中,DLL包含(在DLL项目之外),只有功能机构,例如:

X.H

class x
{
    void myFunc();
}

在另一个CPP文件中,在DLL文件之外:

#include "x.h"
x::myFunc()
{
    //.....
}

dll只能获得功能的尸体,因此,当我编译时,我得到了许多未解决的外部符号(我很确定这是问题,因为我用完全构建的其他类别构建了.h文件,在另一个项目中,没有错误)。那么我该如何解决这个谜?

仅具有函数签名是正常的;实际功能体已经被编译到DLL二进制文件中,并通过链接到实际DLL来解决。

首先要尝试的是确保您实际上链接到上述DLL。仅包含标头还不够,您还需要链接到二进制文件。因此,在项目配置中,您需要将链接添加到(例如)在编译DLL时(如果在MSVC中)时,该链接(例如)在DLL侧创建的.lib文件。该LIB文件使链接器可以知道如何将您通过导入标头包含的功能签名连接到DLL中包含的实际实现。如果您在另一个平台上,机械师可能会有所不同,但是这些概念会相似。

编辑:下一步是确保二进制文件实际上是导出您要链接的符号。确保通过__DECLSPEC(DLL_EXPORT)前缀导出所有接口签名。通常,这是在IFDEF中包装的,以便在编译DLL时声明标题出口,但在客户端项目中包含该标头时,该标题不会。接下来,您可以使用dumpbin检查被修整的导出名称,看看是否有意外的。

这是您示例的修改版本,说明了这种导出风格(请注意,我尚未测试是否编译,对任何错别字表示歉意):

#ifdef BUILDING_MYDLL
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
class MYDLL_API x
{
    void myFunc();
}

然后,您将配置设置为在编译DLL时定义building_mydll,但在编译可执行文件时不会。这样,仅在编译库DLL时,仅在函数上标记了导出。现在,您可以通过mydll_api标记您的公共API函数,它们应该在构建过程中导出。

请注意,DLL_EXPORT,DLL_IMPORT和DECTSPEC都是非常特定于MSVC的构造。其他编译器/Runtimes Hander Symbor以不同的方式导出。

有多种方法可以将DLL链接到Windows上的应用程序中,请查看此现有问题/答案:https://stackoverflow.com/a/2060508/1701823