C++动态库生成核心是导出符号与控制链接:Linux用-fPIC和-shared生成.so,Windows需__declspec(dllexport)声明导出;须注意头文件一致性、位置无关代码及跨平台兼容性。
在 C++ 中生成动态库(Linux 下为 .so,Windows 下为 .dll),核心是用编译器导出符号,并控制链接方式。关键不在于“写代码”,而在于“怎么告诉编译器:这些函数我要给别人用”。
需两步:编译为位置无关代码(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 要求显式声明导出符号,否则链接器看不到函数。
__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)link /DLL /OUT:math_utils.dll math_utils.obj(MSVC)g++ -shared -o math_utils.dll math_utils.o(MinGW)调用动态库的程序必须有对应头文件,且链接时指定库路径和名字。
g++ main.cpp -L. -lmath_utils -o mainLD_LIBRARY_PATH 包含 .,或把 .so 放到系统路径g++ main.cpp -L. -lmath_utils -o main.exe(MinGW).dll 必须和 .exe 在同一目录,或在 PATH 中extern "C"),或用工厂函数返回抽象接口指针用 CMake 可统一管理跨平台构建:
add_library(math_utils SHARED math_utils.cpp)set_target_properties(math_utils PROPERTIES POSITION_INDEPEND
ENT_CODE ON)
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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。