C++如何创建一个动态库(.dll/.so)?(详细步骤)


创建动态库需分离接口与实现,Windows用.dll、Linux/macOS用.so/.dylib;关键步骤包括:一、头文件中用宏统一声明导出符号(Windows需__declspec(dllexport/import),Linux/macOS推荐__attribute__((visibility("default")))并加extern "C"防名字修饰);二、实现代码后编译为目标文件(Linux/macOS须加-fPIC);三、链接生成动态库(Windows用link /DLL,Linux用g++ -shared,macOS用clang++ -dynamiclib);四、通过链接或运行时加载使用。

c++如何创建一个动态库(.dll/.so)?(详细步骤)

创建动态库的关键是分离接口与实现,用编译器导出符号,并按平台规范链接生成二进制文件。Windows 用 .dll,Linux/macOS 用 .so(或 .dylib),但核心流程相似。

一、准备源码:声明导出符号(Windows 必须,Linux 可选)

Windows DLL 需显式标记哪些函数/类对外可见;Linux 默认全局符号都可被链接,但建议加 __attribute__((visibility("default"))) 显式控制。

常见做法是用宏统一处理:

  • Windows:定义 MYLIB_EXPORT 宏,展开为 __declspec(dllexport)(编译时)或 __declspec(dllimport)(使用时)
  • Linux/macOS:定义为 __attribute__((visibility("default"))),未标注的默认隐藏(推荐)

示例头文件 mylib.h:

立即学习“C++免费学习笔记(深入)”;

#ifndef MYLIB_H
#define MYLIB_H
<h1>ifdef _WIN32</h1><h1>ifdef MYLIB_BUILD</h1><pre class='brush:php;toolbar:false;'>#define MYLIB_API __declspec(dllexport)

else

#define MYLIB_API __declspec(dllimport)

endif

else

define MYLIB_API attribute((visibility("default")))

endif

extern "C" { MYLIB_API int add(int a, int b); MYLIB_API int multiply(int a, int b); }

endif

注意:C++ 函数名会因编译器而修饰(name mangling),加 extern "C" 可保持 C 风格符号名,方便跨语言调用或避免链接错误。

二、实现代码并编译成目标文件

写好 mylib.cpp,实现头文件中声明的函数:

#include "mylib.h"
<p>int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }

分别编译(不链接):

图酷AI 图酷AI

下载即用!可以免费使用的AI图像处理工具,致力于为用户提供最先进的AI图像处理技术,让图像编辑变得简单高效。

图酷AI 106 查看详情 图酷AI
  • Windows(MSVC):cl /c /EHsc /DMYLIB_BUILD mylib.cpp → 生成 mylib.obj
  • Linux(g++/clang):g++ -fPIC -c -DMYLIB_BUILD -o mylib.o mylib.cpp
  • macOS:clang++ -fPIC -c -DMYLIB_BUILD -o mylib.o mylib.cpp

关键点:-fPIC(Position Independent Code)在 Linux/macOS 是必须的;Windows DLL 默认支持重定位,无需额外标志。

三、链接生成动态库文件

用目标文件链接出最终动态库:

  • Windows(MSVC):link /DLL /OUT:mylib.dll mylib.obj
  • Linux:g++ -shared -o libmylib.so mylib.o
  • macOS:clang++ -dynamiclib -o libmylib.dylib mylib.o

Linux 下也可加 -Wl,-soname,libmylib.so.1 设置 soname,便于版本管理;macOS 推荐加 -install_name @rpath/libmylib.dylib 方便运行时查找。

四、使用动态库(简单验证)

写一个测试程序 main.cpp:

#include <iostream>
#include "mylib.h"
int main() {
  std::cout << add(3, 5) << "\n";        // 输出 8
  std::cout << multiply(4, 6) << "\n";    // 输出 24
}

编译并运行:

  • Windows:cl main.cpp /link mylib.lib(需先用 lib 工具从 DLL 生成 .lib 导入库),然后把 mylib.dll 放到 exe 同目录或系统 PATH 中
  • Linux:g++ main.cpp -L. -lmylib -o main && LD_LIBRARY_PATH=. ./main
  • macOS:clang++ main.cpp -L. -lmylib -o main && DYLD_LIBRARY_PATH=. ./main

如果提示找不到库,检查路径、权限(Linux/macOS)、是否遗漏 -fPIC 或导出宏定义。

基本上就这些。核心是:头文件控制可见性、源码加导出标记、编译加位置无关选项、链接用共享模式。不复杂但容易忽略细节,比如 Windows 的 dllimport 和 Linux 的 -fPIC。

以上就是C++如何创建一个动态库(.dll/.so)?(详细步骤)的详细内容,更多请关注其它相关文章!


# 客户端  # 体育网站建设美丽图片  # 海口网站建设订制  # 太原网站建设详细方案  # 上海口碑好的营销推广  # 英山seo服务好  # seo全网营销推广广告  # 成名电影网站建设  # 谷歌seo都做哪些工作  # 河北广告推广网站  # 长葛关键词排名优化软件  # 相关文章  # 也可  # 找不到  # 网络编程  # linux  # 如何实现  # 图像处理  # 创建一个  # 图酷  # 头文件  # red  # lsp  # cos  # win  # macos  # c++  # ai  # mac  # windows 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  《偃武》甘宁技能详解  SQL聚合查询、联接与筛选:GROUP BY 子句的正确使用与常见陷阱  C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别  稻壳阅读器官方直达网址链接 稻壳阅读器文档阅读平台主页资源入口  Python中安全地将环境变量转换为整数的类型注解指南  漫蛙漫画官方网站使用_漫蛙manwa网页版在线入口教程  如何自定义苹果手机铃声  B站怎么快速升级 B站用户等级提升攻略【详解】  使用document.execCommand实现Web文本编辑器加粗/取消加粗  Lar*el 关联查询:同时筛选父表与子表数据的高效策略  邦丰播放器频道搜索设置  C++ bind函数使用教程_C++参数绑定与函数适配器的应用  如何在mysql中比较InnoDB和MyISAM区别  电脑从睡眠中被自动唤醒怎么办_Windows唤醒源事件查看与禁用【解决】  Lar*el Eloquent中通过Join查询关联数据表:解决多行子查询问题  Win11如何分屏操作_Win11多窗口分屏技巧  C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧  三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧  猫眼电影app如何设置电影上映提醒_猫眼电影上映提醒设置教程  毒蘑菇VOLUMESHADER_BM官网首页登录入口 毒蘑菇VOLUMESHADER_BM官网首页登录入口说明  蜻蜓FM如何设置移动流量播放  深入理解随机递归函数的确定性:内部节点、叶节点与时间复杂度分析  苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作  iPhone12是否要更新ios16  PHP页面重载后变量状态保持:实现用户档案连续浏览的教程  如何解决Casbin日志与应用日志不统一的问题,使用casbin/psr3-bridge实现无缝集成  Flexbox布局:实现粘性导航与底部页脚的完美结合  苹果手机手电筒无法开启  实时数据流中高效查找最小值与最大值  MacBook Pro词典使用指南  虫虫助手如何更新游戏  b站如何管理订阅_b站订阅标签分类管理  淘口令快速解析技巧  《伊瑟》凶影追缉库卢鲁boss攻略  126邮箱申请入口官网_126邮箱注册免费登录2025  外媒评《燕云十六声》DIY载具新玩法:很像《塞尔达传说王国之泪》!  谷歌浏览器官网地址整理_谷歌浏览器新版直连2026稳定访问  百度竞价WAP显示PC链接问题  《土豆雅思》修改密码方法  sublime如何自定义文件类型图标_AFileIcon插件的主题切换与个性化配置  Bootstrap 5导航栏折叠功能失效:数据属性迁移指南  哔哩哔哩在线观看入口 B站官网免费进入  三角洲行动2025年9月10日摩斯密码分享  悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置  NumPy 高性能技巧:基于多列条件查找最近邻行索引的向量化实现  汽水音乐在线听歌网页版 汽水音乐在线听歌网页版入口  热血江湖归来医师加点攻略  猫眼app抢票快还是小程序快  解决Windows上Composer PATH变量冲突导致的命令无法识别问题 

 2025-12-17

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.