c++如何编译成动态库 c++ .so/.dll文件生成【教程】


C++动态库生成核心是导出符号与控制链接:Linux用-fPIC和-shared生成.so,Windows需__declspec(dllexport)声明导出;须注意头文件一致性、位置无关代码及跨平台兼容性。

在 C++ 中生成动态库(Linux 下为 .so,Windows 下为 .dll),核心是用编译器导出符号,并控制链接方式。关键不在于“写代码”,而在于“怎么告诉编译器:这些函数我要给别人用”。

Linux 下生成 .so 动态库

需两步:编译为位置无关代码(PIC),再链接成共享对象。

  • 源文件(math_utils.cpp)中,无需特殊关键字;C++ 默认所有非 static 全局函数/变量都可导出(但建议显式控制)
  • -fPIC 编译目标文件:
    g++ -fPIC -c math_utils.cpp -o math_utils.o
  • -shared 链接生成 .so
    g++ -shared -o libmath_utils.so math_utils.o
  • 若要隐藏未声明为 extern "C" 的 C++ 符号(避免 name mangling),或控制可见性,可在头文件中加:
    #define EXPORT __attribute__((visibility("default"))),并在函数前加 EXPORT

Windows 下生成 .dll 动态库(MSVC 或 MinGW)

Windows 要求显式声明导出符号,否则链接器看不到函数。

  • 方法一(推荐,跨编译器兼容):用 __declspec(dllexport) 标记导出函数
    头文件 math_utils.h 中:
    #ifdef BUILDING_DLL
    #define DLL_EXPORT __declspec(dllexport)
    #else
    #define DLL_EXPORT __declspec(dllimport)
    #endif
    DLL_EXPORT int add(int a, int b);
  • 编译时定义 BUILDING_DLL
    cl /c /DBUILDING_DLL math_utils.cpp(MSVC)
    g++ -c -DBUILDING_DLL math_utils.cpp(MinGW)
  • 链接生成 DLL:
    link /DLL /OUT:math_utils.dll math_utils.obj(MSVC)
    g++ -shared -o math_utils.dll math_utils.o(MinGW)

头文件与使用方注意事项

调用动态库的程序必须有对应头文件,且链接时指定库路径和名字。

  • Linux 使用时:
    编译: g++ main.cpp -L. -lmath_utils -o main
    运行前确保 LD_LIBRARY_PATH 包含 .,或把 .so 放到系统路径
  • Windows 使用时:
    链接: g++ main.cpp -L. -lmath_utils -o main.exe(MinGW)
    注意:.dll 必须和 .exe 在同一目录,或在 PATH
  • C++ 类导出较复杂,建议只导出 C 风格函数(extern "C"),或用工厂函数返回抽象接口指针

小技巧:一键生成(CMake 示例)

用 CMake 可统一管理跨平台构建:

  • add_library(math_utils SHARED math_utils.cpp)
  • 设置属性让所有符号默认导出(Linux):
    set_target_properties(math_utils PROPERTIES POSITION_INDEPENDENT_CODE ON)
  • Windows 下自动加 dllexport 宏:
    target_compile_definitions(math_utils PRIVATE BUILDING_DLL)
  • 生成后用 cmake --build . 即可产出 .so.dll

不复杂但容易忽略:导出符号、位置无关、头文件一致性 —— 抓住这三点,动态库就稳了。


# linux  # windows  # ai  # c++  # win  # lsp  # red  # Static  # define  # #define  # extern  # int  # 指针  # 接口  # private  # 对象  # default  # 头文件  # 我要  # 并在  # 可在  # 两步  # 给别人  # 若要  # 一键  # 小技巧  # 这三 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: 如何解决Windows时间不准的问题?(自动同步设置)  c++怎么使用std::filesystem遍历文件夹_c++ 递归查找文件与权限修改【技巧】  Win11怎么设置指纹解锁 Win11笔记本录入指纹登录【教程】  如何用::实现工具类方法调用_php静态工具类设计技巧【技巧】  C#怎么创建控制台应用 C# Console App项目创建方法  Win11怎么关闭搜索历史_Win11清除设备上的搜索历史记录  Windows蓝屏错误0x00000023怎么修复_FAT文件系统错误处理  Win11无法拖拽文件到任务栏怎么办_Win11开启拖放功能修复【方法】  Mac上的iMovie如何剪辑视频?(新手入门教程)  如何在 Python 测试中动态配置 @backoff 装饰器的重试次数  如何使用正则表达式批量替换重复的“-”模式为固定字符串  php下载安装包太大怎么下载_分卷压缩下载方法【教程】  php8.4如何实现队列任务_php8.4redis队列简单实现方法【教程】  Python音视频处理高级项目教程_FFmpegPydub剪辑与特效  Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系统【安全指南】  如何更改Windows资源管理器的默认启动位置?(快速访问/此电脑)  Win11怎么关闭定位服务_保护Win11位置隐私设置指南【详解】  Python深度学习实战教程_神经网络模型构建与训练  如何在 Go 结构体中正确初始化 map 字段  如何在Golang中指定模块版本_使用go.mod控制版本号  XML的“混合内容”是什么 怎么用DTD或XSD定义  Windows10系统怎么查看已安装更新_Win10控制面板卸载补丁  如何在 Go 中可靠地测试含 time.Time 字段的结构体  LINUX如何删除用户和用户组_Linux userdel和groupdel命令用法【系统管理】  PHP接收参数长度超限怎么办_修改postmaxsize设置教程【解答】  如何在 IIS 上为 ASP.NET 6 应用排除特定目录并交由 PHP 处理  Windows10系统怎么查看设备管理器_Win10快捷键Win+X菜单使用  PHP主流架构如何做单元测试_工具与流程【详解】  MAC怎么用连续互通相机里的“桌上视角”_MAC在视频通话中同时展示人脸和桌面  php查询数据怎么分组_groupby分组查询配合聚合函数【技巧】  Win10如何卸载Skype_Win10卸载Skype步骤【步骤】  Win11怎么自动隐藏任务栏_Win11全屏显示设置【美化】  php怎么下载安装并配置环境变量_命令行调用PHP技巧【技巧】  如何在Golang中使用闭包_封装变量与函数作用域  如何将文本文件中的竖排字符串转换为横排字符串  如何测试您的网站全球打开速度-网站海外测速工  Win10怎样安装PPT模板_Win10安装PPT模板教程【步骤】  Win10任务栏天气和资讯怎么关闭 Win10禁用新闻和兴趣功能【教程】  Win11如何设置开机问候语 Win11修改登录界面提示【技巧】  如何使用Golang包导出规则_控制函数和变量可见性  Win10怎么关闭自动更新错误重启 Win10策略禁止失败补丁强制重启【防护】  php报错怎么查看_定位PHP致命错误与警告的方法【教程】  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  Windows10如何更改鼠标图标_Win10鼠标属性指针浏览  Windows11怎么用“记事本”自动换行与编码 Windows11记事本启用自动换行选择UTF-8编码避免乱码兼容多语言【教程】  c++20的std::format怎么用 比printf更安全高效的格式化方法【详解】  php嵌入式需要什么环境_搭建php+linux嵌入式开发环境【详解】  php增删改查报错1054怎么办_字段名错误排查修复【解答】  Python异步网络编程_aiohttp说明【指导】  Laravel 查询 JSON 列:高效筛选包含数组中任意值的记录 

 2025-12-27

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

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

点击免费数据支持

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

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@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.