You need to enable JavaScript to run this app. Visual Studio 2019使用C语言创建DLL库未解析外部符号问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 07:54:03