Visual Studio 2019使用C语言创建DLL库未解析外部符号问题咨询
问题解答
DLL的函数实现完全不需要写在头文件中,你遇到的链接报错是缺失关键配置导致的,你修改头文件把实现写进去后能运行,本质是把函数直接编译进了主程序,完全没有用到你生成的DLL文件,属于错误的用法。
错误原因梳理
- 你定义的
HELLO_WORLD_API导出导入宏没有实际使用,头文件中硬写死了__declspec(dllexport)修饰函数,导致主项目引用头文件时识别为需要导出的函数,而非从DLL导入的函数 - 主调用项目没有配置链接DLL生成的导入库(.lib文件):DLL编译完成后会生成.dll动态库和.lib导入库两个核心文件,主项目除了引入头文件,还需要在链接阶段关联导入库,才能找到DLL中函数的实现地址,这就是你遇到
unresolved external symbol _func referenced in function main报错的核心原因
修正方案
1. 调整代码
Hello.h
#pragma once #include <stdio.h> #ifdef HELLO_WORLD_EXPORTS #define HELLO_WORLD_API __declspec(dllexport) #else #define HELLO_WORLD_API __declspec(dllimport) #endif // 使用宏自动处理导出/导入修饰 HELLO_WORLD_API void func(void);
Hello.c(移除头文件才用的#pragma once,改用宏修饰函数)
#include <stdio.h> #include "Hello.h" HELLO_WORLD_API void func (void) { printf("Hello from DLL.\n"); }
main.c 无需修改
2. 补全项目配置
- DLL项目配置:打开DLL项目属性→
C/C++→预处理器→预处理器定义,新增HELLO_WORLD_EXPORTS宏,编译项目得到Hello.dll和Hello.lib两个文件 - 主调用项目配置:
- 打开属性→
C/C++→常规→附加包含目录,添加Hello.h所在的文件夹路径 - 打开属性→
链接器→常规→附加库目录,添加DLL项目输出的Hello.lib所在的文件夹路径 - 打开属性→
链接器→输入→附加依赖项,新增Hello.lib
- 打开属性→
- 运行主项目前,将
Hello.dll复制到主项目的输出目录下即可正常运行
内容的提问来源于stack exchange,提问作者pekoms
相关产品推荐
相关产品推荐

