全网整合营销服务商

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

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

C++如何调用动态链接库(DLL/SO)?(代码示例)

Windows用LoadLibrary+GetProcAddress,Linux用dlopen+dlsym实现运行时动态加载;需注意函数导出(__declspec(dllexport)/__attribute__((visibility("default"))))、类型安全调用、跨平台封装、路径与符号可见性、内存管理边界等关键点。

Windows 下用 LoadLibrary + GetProcAddress,Linux 下用 dlopen + dlsym。核心是运行时加载、获取函数地址、类型安全调用。

Windows:用 LoadLibrary 加载 DLL

需要头文件 #include windows.h>,DLL 导出函数需用 __declspec(dllexport)(编译 DLL 时),调用方用 typedef 声明函数指针类型,再通过 GetProcAddress 获取地址。

示例(调用一个 int add(int, int) 函数):

  • 先定义函数指针类型:typedef int (*AddFunc)(int, int);
  • 加载 DLL:HMODULE hDll = LoadLibrary(L"mylib.dll");
  • 获取函数地址:AddFunc add = (AddFunc)GetProcAddress(hDll, "add");
  • 检查并调用:if (add) { int r = add(3, 5); }
  • 用完释放:FreeLibrary(hDll);

Linux:用 dlopen 加载 SO

需链接 -ldl,头文件 #include 。SO 中函数默认可见,但建议加 __attribute__((visibility("default"))) 显式导出。

示例(同样调用 add 函数):

  • 定义函数指针:typedef int (*AddFunc)(int, int);
  • 打开共享库:void* handle = dlopen("./libmylib.so", RTLD_LAZY);
  • 获取符号:AddFunc add = (AddFunc)dlsym(handle, "add");
  • 检查错误:const char* err = dlerror(); if (err) { /* 处理 */ }
  • 调用后关闭:dlclose(handle);

跨平台封装小技巧

可用宏隔离差异,让业务代码统一:

  • 定义统一句柄类型:#ifdef _WIN32
      using LibHandle = HMODULE;
    #else
      using LibHandle = void*;
    #endif
  • 封装加载/查找/卸载函数,内部按平台分支处理
  • 务必检查返回值(NULL / nullptr / INVALID_HANDLE_VALUE),避免崩溃
  • 函数签名必须严格一致,C++ 重载名会 mangling,DLL/SO 中导出推荐用 extern "C" 防止

常见坑和注意点

  • DLL 路径问题:Windows 默认只在系统路径、当前目录、PATH 中找;可用绝对路径或 SetDllDirectory
  • SO 依赖:用 ldd libmylib.so 查依赖,确保运行时能解析
  • 类对象不能直接跨模块传递:只传 C 风格函数或纯虚接口(如 COM/抽象基类 + 工厂函数)
  • 内存管理:谁分配谁释放;避免在 DLL 中 new、在主程序中 delete(可能用不同堆)

基本上就这些。不复杂但容易忽略路径、符号可见性、调用约定和内存边界。


# linux  # windows  # cad  # c++  # win  # typedef  # lsp  # NULL  # if  # 封装  # include  # const  # extern  # char  # int  # void  # 指针  # 接口  #   # using  # 指针类型  # delete  # 对象  # default  # 加载  # 内存管理  # 头文件  # 见性  # 句柄  # 主程序  # 只在  # 用完  # 小技巧  # 中找 


相关文章: 深圳网站制作案例,网页的相关名词有哪些?  PHP 500报错的快速解决方法  江苏网站制作公司有哪些,江苏书法考级官方网站?  长沙企业网站制作哪家好,长沙水业集团官方网站?  建站之星如何快速生成多端适配网站?  ,石家庄四十八中学官网?  微信小程序 input输入框控件详解及实例(多种示例)  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  广东企业建站网站优化与SEO营销核心策略指南  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  如何在阿里云ECS服务器部署织梦CMS网站?  建站之星安装步骤有哪些常见问题?  建站之星如何开启自定义404页面避免用户流失?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  中山网站制作网页,中山新生登记系统登记流程?  如何快速生成可下载的建站源码工具?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  购物网站制作公司有哪些,哪个购物网站比较好?  ,巨量百应是干嘛的?  手机网站制作与建设方案,手机网站如何建设?  定制建站如何定义?其核心优势是什么?  郑州企业网站制作公司,郑州招聘网站有哪些?  公司网站的制作公司,企业网站制作基本流程有哪些?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  建站主机选购指南与交易推荐:核心配置解析  建站之星CMS五站合一模板配置与SEO优化指南  如何挑选高效建站主机与优质域名?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  详解jQuery中基本的动画方法  网站制作免费,什么网站能看正片电影?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  建站之星安装后如何自定义网站颜色与字体?  如何获取免费开源的自助建站系统源码?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  外贸公司网站制作,外贸网站建设一般有哪些步骤?  盐城做公司网站,江苏电子版退休证办理流程?  小程序网站制作需要准备什么资料,如何制作小程序?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  网站设计制作企业有哪些,抖音官网主页怎么设置?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  相册网站制作软件,图片上的网址怎么复制?  如何快速搭建二级域名独立网站?  宝塔建站后网页无法访问如何解决?  如何注册花生壳免费域名并搭建个人网站?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  建站org新手必看:2024最新搭建流程与模板选择技巧  php json中文编码为null的解决办法 

您的项目需求

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