全网整合营销服务商

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

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

c++的动态库(.so/.dll)和静态库(.a/.lib)有什么区别 如何创建和使用【链接器】

静态库在编译链接时将代码直接复制进可执行文件,生成独立但体积大的程序;动态库仅在编译时记录符号引用,运行时由操作系统加载共享代码,节省资源但依赖环境。

动态库和静态库的核心区别在于代码何时被合并到可执行文件中:静态库在编译链接阶段就把代码直接复制进去,生成的程序自带所有依赖;动态库则只在编译时记录“需要哪些符号”,实际代码留在外部文件里,运行时(或加载时)才由操作系统映射进内存。

静态库:编译时打包,独立但体积大

静态库是目标文件(.o/.obj)的归档集合,Linux 下是 .a 文件(如 libmath.a),Windows 下常见 .lib(不含导出表的那种)。它不包含运行时逻辑,只是“代码仓库”。

  • 创建方式(Linux 示例):
    g++ -c add.cpp -o add.o
    ar rcs libmath.a add.o sub.oar 打包,rcs 表示创建、替换、索引)
  • 使用方式(链接时指定):
    g++ main.cpp -L. -lmath -o app → 链接器从当前目录(-L.)找 libmath.a,并解析其中的 addsub 符号
  • 特点:生成的可执行文件可脱离库文件运行;多个程序用同一静态库会各自保留一份副本,浪费磁盘和内存;更新库需重新编译全部依赖程序。

动态库:运行时加载,共享但有依赖

动态库是已重定位的机器码模块,Linux 下为 .so(shared object),Windows 下为 .dll(dynamic-link library)。它包含符号表、重定位信息和初始化/清理入口,能被多个进程共享内存页。

  • 创建方式(Linux):
    g++ -fPIC -c add.cpp -o add.o(必须加 -fPIC 生成位置无关代码)
    g++ -shared -o libmath.so add.o sub.o
  • 使用方式分两种:
    隐式链接(编译时链接)g++ main.cpp -L. -lmath -o app,同时需确保运行时能找到库(如设置 LD_LIBRARY_PATH=. 或安装到系统路径)
    显式链接(运行时 dlopen):用 dlopen()/dlsym() 手动加载,适合插件机制,无需编译期依赖
  • 特点:节省磁盘与内存;升级库只需替换 .so 文件,无需重编译;但运行环境必须提供对应版本,否则报 “xxx not found” 错误。

链接器(Linker)在其中起什么作用?

链接器(如 Linux 的 ld、Windows 的 link.exe)不是编译器,它不处理语法,而是负责符号解析 + 地址绑定。它读取目标文件和库,把所有未定义引用(如对 add() 的调用)匹配到具体定义(在 .a 或 .so 中),再计算每个函数/变量的最终内存地址。

  • 对静态库:链接器逐个扫描 .a 中的目标文件,只提取真正被引用的 .o,然后像普通目标文件一样合并进可执行体
  • 对动态库:链接器只检查符号是否存在(不复制代码),生成一个“动态段”(.dynamic),记录所需 .so 名称及导入符号表;真正的地址绑定延迟到加载时(由动态链接器如 ld-linux.so 完成)
  • 关键命令行选项:
    -L:添加库搜索路径
    -l:链接名为 lib.alib.so 的库(优先选 .so)
    -static:强制只用静态库(即使有 .so 也忽略)
    -Wl,-rpath,:把运行时库路径写进可执行文件,避免依赖 LD_LIBRARY_PATH

怎么选?看场景

  • 嵌入式或交付单文件工具 → 选静态库(免部署依赖)
  • 大型软件、频繁更新基础模块(如图形、加密)→ 选动态库(热更新、节约资源)
  • 调试阶段想快速验证接口 → 先用静态库,避免环境配置问题
  • 写跨平台 C++ 库 → 同时提供 .a/.lib 和 .so/.dll,并明确说明链接方式


# linux  # windows  # 操作系统  # app  # 工具  # ai  # c++  # win  # 区别  # 环境配置  # red  # Static  # Object  # 接口  # ar  # 加载  # 可执行文件  # 多个  # 它不  # 绑定  # 运行环境  # 两种  # 只需  # 所需 


相关文章: 如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  高端云建站费用究竟需要多少预算?  如何零基础在云服务器搭建WordPress站点?  广州商城建站系统开发成本与周期如何控制?  如何快速查询域名建站关键信息?  如何用IIS7快速搭建并优化网站站点?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  网站制作网站,深圳做网站哪家比较好?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  焦点电影公司作品,电影焦点结局是什么?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  长沙企业网站制作哪家好,长沙水业集团官方网站?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何通过cPanel快速搭建网站?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  建站之星2.7模板:企业网站建设与h5定制设计专题  建站主机默认首页配置指南:核心功能与访问路径优化  开源网站制作软件,开源网站什么意思?  企业微网站怎么做,公司网站和公众号有什么区别?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  如何将凡科建站内容保存为本地文件?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  建站之星图片链接生成指南:自助建站与智能设计教程  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  购物网站制作公司有哪些,哪个购物网站比较好?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  网站制作企业,网站的banner和导航栏是指什么?  建站主机服务器选型指南与性能优化方案解析  如何在万网自助建站平台快速创建网站?  营销式网站制作方案,销售哪个网站招聘效果最好?  音响网站制作视频教程,隆霸音响官方网站?    ,石家庄四十八中学官网?  如何使用Golang安装API文档生成工具_快速生成接口文档  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  建站VPS选购需注意哪些关键参数?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  哈尔滨网站建设策划,哈尔滨电工证查询网站?  如何在建站之星绑定自定义域名?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  建站之星安装提示数据库无法连接如何解决?  小程序网站制作需要准备什么资料,如何制作小程序?  如何通过西部建站助手安装IIS服务器?  公司门户网站制作流程,华为官网怎么做?  如何选择高效便捷的WAP商城建站系统?  Python lxml的etree和ElementTree有什么区别  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站? 

您的项目需求

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