全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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:

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++  # linux  # windows  # 处理器  # win  # lsp  # red  # define  # if  # include  # extern  # 预处理器  # int  # 接口  # class  # public  # default  # visual studio  # 头文件  # 动态链接库  # 多个  # 才会  # 推荐使用  # 可在  # 增强版  # 要使  # 命令行  # 未被 


相关文章: 如何在IIS服务器上快速部署高效网站?  建站之星24小时客服电话如何获取?  黑客入侵网站服务器的常见手法有哪些?  广州商城建站系统开发成本与周期如何控制?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  香港服务器选型指南:免备案配置与高效建站方案解析  建站之星2.7模板:企业网站建设与h5定制设计专题  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  在线教育网站制作平台,山西立德教育官网?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何通过远程VPS快速搭建个人网站?  网站app免费制作软件,能免费看各大网站视频的手机app?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  如何在阿里云服务器自主搭建网站?  简历在线制作网站免费版,如何创建个人简历?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  网站制作模板下载什么软件,ppt模板免费下载网站?  如何选择适配移动端的WAP自助建站平台?  制作网站外包平台,自动化接单网站有哪些?  建站之星代理费用多少?最新价格详情介绍  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  建站之星安装模板失败:服务器环境不兼容?  网站制作员失业,怎样查看自己网站的注册者?  如何用狗爹虚拟主机快速搭建网站?  如何制作算命网站,怎么注册算命网站?  常州自助建站工具推荐:低成本搭建与模板选择技巧  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  建站DNS解析失败?如何正确配置域名服务器?  家具网站制作软件,家具厂怎么跑业务?  威客平台建站流程解析:高效搭建教程与设计优化方案  如何通过PHP快速构建高效问答网站功能?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  代刷网站制作软件,别人代刷火车票靠谱吗?  建站之星备案流程有哪些注意事项?  建站主机如何安装配置?新手必看操作指南  如何用PHP快速搭建CMS系统?  制作销售网站教学视频,销售网站有哪些?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  广州建站公司哪家好?十大优质服务商推荐  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  h5在线制作网站电脑版下载,h5网页制作软件?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  安徽网站建设与外贸建站服务专业定制方案  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  建站为何优先选择香港服务器? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。