新闻中心
c++怎么编译生成一个动态链接库dll或so_c++共享库制作与导出方法
在C++中生成动态链接库需根据平台使用不同导出方式:Windows下用__declspec(dllexport)配合/MD或/LD编译,Linux下用-fPIC和-shared生成SO,通过预定义宏统一接口,结合extern "C"避免名称修饰,确保符号正确导出。

在C++中编译生成动态链接库(Windows下为DLL,Linux下为SO)需要根据平台使用不同的编译选项和符号导出方式。核心在于正确声明要导出的函数或类,并用编译器支持的方式生成共享库文件。
Windows下生成DLL
在Windows上使用MSVC或MinGW编译器可以生成DLL文件。关键是要使用__declspec(dllexport)导出符号。
示例代码(mathlib.h):
#ifndef MATHLIB_H#define MATHLIB_H
#ifdef MATHLIB_EXPORTS
#define MATHLIB_API __declspec(dllexport)
#else
#define MATHLIB_API __declspec(dllimport)
#endif
extern "C" MATHLIB_API int add(int a, int b);
class MATHLIB_API MathClass {
public:
int multiply(int a, int b);
};
#endif
实现文件(mathlib.cpp):
#define MATHLIB_EXPORTS#include "mathlib.h"
extern "C" MATHLIB_API int add(int a, int b) {
return a + b;
}
int MathClass::multiply(int a, int b) {
return a * b;
}
使用Visual Studio命令行编译DLL:
cl /LD mathlib.cpp /link /out:mathlib.dll说明:
- /LD 表示生成DLL
- 定义 MATHLIB_EXPORTS 使头文件中的宏展开为 dllexport
- 使用 extern "C" 可避免C++名称修饰,便于外部调用
Linux下生成SO(共享库)
Linux默认导出所有全局符号,但推荐使用可见性属性控制导出,提升性能并减少体积。
修改头文件(mathlib.h):
#ifndef MATHLIB_H#define MATHLIB_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _WIN32
#ifdef MATHLIB_EXPORTS
#define MATHLIB_API __declspec(dllexport)
#else
#define MATHLIB_API __declspec(dllimport)
#endif
#else
#if defined(__GNUC__) && (__GNUC__ >= 4)
#define MATHLIB_API __attribute__((visibility("default")))
#else
#define MATHLIB_API
#endif
#endif
MATHLIB_API int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif
编译生成SO:
PictoGraphic
AI驱动的矢量插图库和插图生成平台
133
查看详情
g++ -fPIC -shared mathlib.cpp -o libmathlib.so
说明:
- -fPIC:生成位置无关代码,必要选项
- -shared:指示生成共享库
- 使用 visibility("default") 显式导出符号,配合编译选项 -fvisibility=hidden 可隐藏未标记符号
跨平台兼容处理
通过预处理器定义统一接口,使代码可在多个平台使用。
编译时导出定义:
- Windows (MSVC/Min
GW): 编译库时加 D MATHLIB_EXPORTS
- Linux: 无需额外定义,除非使用 visibility 控制
例如Linux编译命令增强版:
g++ -fPIC -fvisibility=hidden -shared mathlib.cpp -o libmathlib.so这样只有标记 MATHLIB_API 的函数才会被导出。
验证导出符号
检查生成的库是否包含期望的符号:
- Windows: 使用 dumpbin /exports mathlib.dll
- Linux: 使用 nm -D libmathlib.so 或 readelf -s libmathlib.so
确保函数名未被过度修饰(特别是C函数建议用 extern "C" 包裹)。
基本上就这些。关键是根据不同平台设置正确的导出宏和编译选项,保持接口清晰稳定。跨平台项目可结合 CMake 管理构建流程,自动处理差异。
以上就是c++++怎么编译生成一个动态链接库dll或so_c++共享库制作与导出方法的详细内容,更多请关注其它相关文章!
# 头文件
# 上饶营销推广怎么找
# 网店网站seo策划
# 网站推广经验工作
# 天津seo优化找哪家
# 东城大型网站建设
# 跨界合作营销推广方案
# 网站推广代运营收费标准
# 深圳服务seo公司
# 赌博网站怎样推广
# 推广品牌营销销售招聘
# 推荐使用
# 才会
# 多个
# c++
# 配置文件
# 解决方法
# 怎么做
# 重写
# 有什么
# red
# lsp
# win
# 处理器
# windows
# linux
# 动态链接库
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
CKEditor 5 自定义构建在React应用中渲染失败的调试与解决
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
yandex入口引擎手机版 yandex安卓版下载入口
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
Typer应用中动态命令行参数的解析与处理
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
企业名称高精度匹配:N-gram方法在结构相似性分析中的应用
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践
AO3同人作品网入口 AO3搜索引擎官网永久地址
必由学登录入口 必由学官方网站在线访问链接
抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站
铃兰之剑为这和平的世界希里技能组及加点推荐
魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】
一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化
可靠CSGO开箱平台解析 CSGO开箱网合集
Pandas DataFrame:高效添加条件计算列
J*aScript异步迭代器_j*ascript异步遍历
海棠电脑版入口_通过电脑访问海棠官网阅读
Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】
内存疯狂猛猛涨价:主板销量直接腰斩!
Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧
手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议
QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网
Archive of Our Own官网直达 AO3最新可用地址一览
Yandex免登录网页版地址 Yandex搜索引擎官方访问入口
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
J*aScript动态修改指定div内所有a标签样式指南
《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元
纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析
AI泡沫首次被“刺破”:GPU十年都无法存活!
俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口
腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录
优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法
Golang如何使用new_Go new分配内存机制讲解
C++如何实现单例模式_C++设计模式之线程安全的单例写法
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南
迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法
微信语音通话掉线如何解决 微信语音通话稳定优化方法
抖音未来赚钱的新趋势 2025年值得关注的变现风口分析
2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
Django模型中自动计算可用余额的实现方法
火锅吃太多会怎样 火锅吃太多会上火吗
向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程
Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略
Golang如何使用net/url解析URL_Golang URL解析与处理方法


2025-11-22
浏览次数:次
返回列表
GW): 编译库时加 D MATHLIB_EXPORTS