新闻中心

c++怎么编译生成一个动态链接库dll或so_c++共享库制作与导出方法

2025-11-22
浏览次数:
返回列表
在C++中生成动态链接库需根据平台使用不同导出方式:Windows下用__declspec(dllexport)配合/MD或/LD编译,Linux下用-fPIC和-shared生成SO,通过预定义宏统一接口,结合extern "C"避免名称修饰,确保符号正确导出。

c++怎么编译生成一个动态链接库dll或so_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 PictoGraphic

AI驱动的矢量插图库和插图生成平台

PictoGraphic 133 查看详情 PictoGraphic g++ -fPIC -shared mathlib.cpp -o libmathlib.so

说明:
- -fPIC:生成位置无关代码,必要选项
- -shared:指示生成共享库
- 使用 visibility("default") 显式导出符号,配合编译选项 -fvisibility=hidden 可隐藏未标记符号

跨平台兼容处理

通过预处理器定义统一接口,使代码可在多个平台使用。

编译时导出定义:

  • Windows (MSVC/MinGW): 编译库时加 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.soreadelf -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解析与处理方法 

搜索