当前位置: 首页 > java >正文

gcc编译构建流程-动态链接库

创建一个动态库

├─mymath
│  └─src
│  │  └─mymath.cpp
│  └─include
│  │  └─mymath.h

代码实现如下

// mymath.h
#pragma once
int add_v1(int, int);// mymath.cpp
int add_v1(int a, int b)
{return a + b;
}

编译成一个动态库

g++ -fPIC -c src/mymath.cpp -o mymath.o -Iinclude     # 生成位置无关代码
g++ -shared -o libmymath.so mymath.o     # 生成共享库

其他项目引入

假如我们有个项目引入了这个三方库

├─mymath
│  └─mymath.so
│  └─include
│  │  └─mymath.h
├─main.cpp

main.cpp的使用如下

// main.cpp
#include <iostream>
#include "mymath.h"int main()
{int v1 = add_v1(1,2);std::cout << v1 << std::endl;
}

我们进行编译链接

gcc -c main.cpp -o main.o -Imymath/include # 编译
gcc main.o -o main -Lmymath -llibmymath -lstdc++ # 链接动态库

动态库升级

如果后续我们的动态链接库升级后,比如对add_v1进行了优化,新增了一个特性函数sub_v1等

// mymath.h
#pragma once
int add_v1(int, int);
int sub_v1(int, int); // 新增功能函数// mymath.cpp
int add_once(int a, int b) {return a + b + 1;
}// add函数进行优化
int add_v1(int a, int b) {return add_once(a, b);
}
int sub_v1(int a, int b) {return a + b;
}

整个流程其实没有什么变化

g++ -fPIC -c src/mymath.cpp -o mymath.o -Iinclude     # 生成位置无关代码
g++ -shared -o libmymath.so mymath.o     # 生成共享库

使用这个动态库的项目只要更新一下so文件就可以了,非常的简单。但是直接覆盖会有兼容性的问题,例如旧版本的程序运行这个新库的时候就会直接报错,我们希望这两个版本可以同时保留,并且进行切换。一种最简单直接的方法就是提供版本号,例如老版本叫做libmymath.so.1,新版本叫做libmymath.so.2,这样新老程序就可以同时跑起来了。

g++ -fPIC -c src/mymath.cpp -o mymath.o -Iinclude     # 生成位置无关代码
g++ -shared -o libmymath.so.2 mymath.o     # 生成共享库

动态库命名管理

兼容行管理有一套命名规范

Real Name(真实名称)​​​​

  • 格式​​:lib<库名>.so.<主版本号>.<次版本号>.<发布版本号>(如 libz.so.1.2.8)。
  • ​​作用​​:包含实际的二进制代码,文件名中的版本号标识具体功能变更:
    • 主版本号​​:接口不兼容的重大升级(如删除函数)。
    • ​​次版本号​​:向后兼容的功能新增(如添加新函数)。
    • 发布版本号​​:Bug 修复或优化,不影响兼容性。

​​Soname(共享对象名)​​

  • ​​格式​​:lib<库名>.so.<主版本号>(如 libz.so.1)。
  • ​​作用​​:编译时写入库文件头(通过 readelf -d libxxx.so | grep SONAME 查看)。程序运行时按此名称加载库(如 libz.so.1 指向 libz.so.1.2.8)。

​​Link Name(链接名)​​

  • ​​格式​​:lib<库名>.so(如 libz.so)
  • 作用​​:编译时通过 -l<库名> 链接(如 -lz 会查找 libz.so)。本质​​是一个指向 soname 的软链接(如 libz.so → libz.so.1)。
​​名称类型​​ ​​格式​​ ​​作用场景​​ ​​管理工具​​
Real Namelibxxx.so.X.Y.Z实际二进制文件编译器生成
Sonamelibxxx.so.X运行时加载ldconfig 维护
Link Namelibxxx.so编译时链接手动创建软链接
http://www.xdnf.cn/news/10552.html

相关文章:

  • YOLO机械臂丨使用unity搭建仿真环境,YOLO算法识别,Moveit2控制
  • 残差神经网络ResNet
  • Webpack依赖
  • 前端面试准备-6
  • unity随机生成未知符号教程
  • 字节跳动社招面经 —— BSP驱动工程师(5)
  • webfuture:如何屏蔽后台发文界面的保存为新文章按钮?
  • 使用 fastai 进行文本分类的简明指南 - Fastai Part 5
  • 【仿muduo库实现并发服务器】使用正则表达式提取HTTP元素
  • java基础学习(二十一)
  • oscp练习 PG Wombo
  • 「完整」AI文档库 | 5月20最新发布,221页,《北京大学AI+Agent与Agentic+AI的原理和应用洞察与未来展望》
  • ChatOn:智能AI聊天助手,开启高效互动新时代
  • pikachu靶场通关笔记09 XSS关卡05-DOM型XSS-X
  • 第18讲、Odoo接口开发详解:原理、类型与实践
  • 【软件测试】火狐驱动下载镜像
  • Golang学习之旅
  • linux驱动 - 5: simple usb device驱动
  • 小白的进阶之路系列之十----人工智能从初步到精通pytorch综合运用的讲解第三部分
  • CppCon 2014 学习:Exception-Safe Coding
  • [免费]微信小程序网上花店系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
  • Cesium快速入门到精通系列教程四:加载渲染GEOJSON数据
  • BA-SAM: 用于 Segment Anything 模型的可扩展偏置模式注意力掩码
  • vue-13(延迟加载路由)
  • Oracle的Hint
  • 2025/6月最新Cursor(0.50.5版本)一键自动更换邮箱无限续杯教程
  • Spring 5 响应式编程:构建高性能全栈应用的关键
  • 数据库系统概论(十二)SQL 基于派生表的查询 超详细讲解(附带例题表格对比带你一步步掌握)
  • MySQL-多表关系、多表查询
  • Qt OpenGL 相机实现