C++怎么写动态库 C++生成DLL与调用DLL详细步骤【工程】
发布时间 - 2026-02-02 00:00:00 点击率:次正确配置生成DLL需确保三点:项目属性设为Dynamic Library;源文件用__declspec(dllexport)或.def文件导出符号;头文件用宏区分dllimport/dllexport并加extern "C"防名字修饰。
Visual Studio 项目中怎么正确配置生成 DLL
生成 DLL 的关键不是写代码,而是让编译器知道“这个工程要导出符号”。默认新建的 C++ 动态库项目(DLL)已设好基础配置,但手动建空项目或从静态库改过来时极易漏掉 __declspec(dllexport) 或项目属性设置。
必须确认以下三点:
- 项目属性 → 配置属性 → 常规 → “配置类型”为
Dynamic Library (.dll) - C++ 源文件中,所有要被外部调用的函数/类,必须显式标记导出:用
__declspec(dllexport)(Windows 特有),或更推荐的方式——通过模块定义文件(.def)统一导出 - 若使用
__declspec(dllexport),建议配合宏封装,避免在调用方误用:例如定义#define MYDLL_API __declspec(dllexport),并在头文件中对导出函数加该宏;调用方则用__declspec(dllimport)
不加导出声明的函数,即使编译成 DLL,链接时也会报 LNK2019: unresolved external symbol。
头文件里如何安全声明 DLL 导出函数
头文件是调用方和实现方的契约。写错会导致编译通过但运行崩溃,或链接失败。
典型错误是直接在头文件里写 __declspec(dllexport) —— 这会让调用方也尝试导出,引发重复定义或链接错误。
正确做法是用宏区分编译角色:
#ifdef BUILDING_MYDLL #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif
extern "C" { MYDLL_API int add(int a, int b); }
其中 BUILDING_MYDLL 是你在 DLL 工程的“预处理器定义”里手动添加的宏(项目属性 → C/C++ → 预处理器 → 预处理器定义)。这样头文件在 DLL 编译时展开为 dllexport,在调用方编译时展开为 dllimport。
加 extern "C" 是为了禁用 C++ 名字修饰(name mangling),否则 C++ 函数导出后名字乱码,C# 或其他语言根本没法调用。
隐式链接调用 DLL 的完整步骤(.lib + .h + .dll 缺一不可)
这是最常用、最稳妥的调用方式,但三者路径和内容必须严格匹配,否则运行时报 0xc000007b 或 找不到指定模块。
调用方工程需配置:
- 包含目录:指向 DLL 工程的头文件所在路径(如
$(SolutionDir)MyDll\include) - 库目录:指向生成的
.lib文件所在目录(如$(OutDir),即 DLL 输出目录) - 附加依赖项:填入
MyDll.lib(注意不是MyDll.dll) - 运行时把
MyDll.dll放到调用方可执行文件同目录下(或系统 PATH 路径中)
常见坑:
- 用了 x64 DLL,但调用方是 Win32 配置 → 直接加载失败,错误码
ERROR_BAD_EXE_FORMAT - 忘记复制
.dll到输出目录,调试时提示LoadLibrary failed: 126 - 头文件里声明了函数,但 DLL 工程没实际实现,或导出名不一致(尤其没加
extern "C"时)→ 运行时GetProcAddress返回 NULL
用 LoadLibrary + GetProcAddress 手动加载 DLL(适用于插件场景)
这种方式绕过链接期绑定,适合运行时决定是否加载、或多版本共存等场景,但写法稍繁琐,且失去编译期类型检查。
核心是三步:
- 用
LoadLibrary(L"MyDll.dll")获取模块句柄(返回HMODULE) - 用
GetProcAddress(hModule, "add")获取函数地址(注意:C++ 函数名需用修饰后名字,除非加了extern "C";C 函数名就是字符串字面量) - 把返回值强制转为函数指针类型再调用,例如:
typedef int (*ADD_FUNC)(int, int); ADD_FUNC pAdd = (ADD_FUNC)GetProcAddress(...); int r = pAdd(3, 4);
必须检查每一步返回值:如果 LoadLibrary 返回 NULL,用 GetLastError() 查具体原因(比如路径错、依赖缺失、位数不匹配);如果 GetProcAddress 返回 NULL,大概率是函数名拼错或未导出。
别忘了最后调用 FreeLibrary(hModule),否则 DLL 句柄泄漏,多次加载后进程无法退出。
导出类比导出函数更复杂,涉及虚表、内存分配器一致性等问题,除非明确需要跨 DLL 边界传递对象,否则优先用纯 C 风格函数接口。另外,DLL 中尽量避免使用 STL 容器作为参数或返回值——不同模块可能用不同版本 CRT,导致析构崩溃。
# windows
# 处理器
# cad
# ai
# c++
# win
# c#
# typedef
# lsp
# NULL
# define
# 封装
# include
# extern
# 字符串
# 预处理器
# int
# 指针
# 接口
# 指针类型
# symbol
# 对象
# visual studio
# 头文件
# 加载
# 句柄
# 返回值
# 三点
# 会报
# 这是
# 找不到
# 你在
# 设为
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
北京企业网站设计制作公司,北京铁路集团官方网站?
如何在阿里云通过域名搭建网站?
Python3.6正式版新特性预览
iOS中将个别页面强制横屏其他页面竖屏
如何在香港免费服务器上快速搭建网站?
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
Laravel如何配置Horizon来管理队列?(安装和使用)
微信h5制作网站有哪些,免费微信H5页面制作工具?
javascript如何操作浏览器历史记录_怎样实现无刷新导航
Laravel如何使用Blade组件和插槽?(Component代码示例)
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
Linux后台任务运行方法_nohup与&使用技巧【技巧】
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
详解Oracle修改字段类型方法总结
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
*服务器网站为何频现安全漏洞?
如何在IIS7中新建站点?详细步骤解析
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
如何在万网开始建站?分步指南解析
浅谈javascript alert和confirm的美化
三星、SK海力士获美批准:可向中国出口芯片制造设备
Laravel中的Facade(门面)到底是什么原理
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
如何登录建站主机?访问步骤全解析
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
网易LOFTER官网链接 老福特网页版登录地址
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
浅析上传头像示例及其注意事项
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何在Windows环境下新建FTP站点并设置权限?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
英语简历制作免费网站推荐,如何将简历翻译成英文?
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
如何快速启动建站代理加盟业务?
如何在万网利用已有域名快速建站?
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
Python自动化办公教程_ExcelWordPDF批量处理案例
如何用5美元大硬盘VPS安全高效搭建个人网站?
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
如何做网站制作流程,*游戏网站怎么搭建?


