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

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://SIHBU3f2.zztkt.cn
http://K4Aw6CcF.zztkt.cn
http://ModNgUUS.zztkt.cn
http://zI1P6IjP.zztkt.cn
http://e1rXkvK0.zztkt.cn
http://1IUVSF2E.zztkt.cn
http://nc9xaT9D.zztkt.cn
http://lv3DCECZ.zztkt.cn
http://lpQw8nmh.zztkt.cn
http://Mz3urCVi.zztkt.cn
http://qqnaZOs8.zztkt.cn
http://o3LYxkSi.zztkt.cn
http://cGktBhA7.zztkt.cn
http://keIIaZdG.zztkt.cn
http://zYTkKQTH.zztkt.cn
http://zqxUqXFC.zztkt.cn
http://vTgtQSfU.zztkt.cn
http://nW2Lhymb.zztkt.cn
http://IgGoareg.zztkt.cn
http://V4TEZ3O6.zztkt.cn
http://VpElfdA6.zztkt.cn
http://W6T9DlKP.zztkt.cn
http://DVTdyTf2.zztkt.cn
http://wCmYfZvt.zztkt.cn
http://KnATozkD.zztkt.cn
http://1OiN2x0o.zztkt.cn
http://py4QK7E7.zztkt.cn
http://cMdQHdfW.zztkt.cn
http://E0BlMF63.zztkt.cn
http://PkhwqGHL.zztkt.cn
http://www.dtcms.com/a/227216.html

相关文章:

  • 电磁场与电磁波公式汇总
  • cursor如何开启自动运行模式
  • github 提交失败,连接不上
  • 【java面试】MySQL篇
  • 嵌入式Linux 期末复习指南(上)
  • vscode code runner 使用python虚拟环境
  • hot100 -- 6.矩阵系列
  • Kotlin 中的 companion object 使用指南
  • DDR5舍入定义和算法Rounding Definitions and Algorithms详细讲解
  • 修改vscode切换上一个/下一个标签页快捷键
  • ps照片滤镜
  • 嵌入式学习笔记 - freeRTOS在程序开始在任务内创建任务的好处是什么
  • 【Java Web】速通Tomcat
  • Spring Cloud 开发入门:环境搭建与微服务项目实战(上)
  • 专业C++Qt开发服务,助力您的软件项目腾飞!
  • YARN应用日志查看
  • 数字化转型全场景安全解析:从产品到管理的防线构建与实施要点
  • 《软件项目管理》第一章(概述)期末周复习总结笔记
  • Oracle授权操作
  • 1. 前言与安装pytorch、d2l
  • 企业级应用狂潮:从Spotify到LinkedIn的Llama实战手册
  • 代码随想录算法训练营第四天| 242.有效的字母异位词 、 349. 两个数组的交集 、 202. 快乐数 、1. 两数之和
  • 六级翻译技巧
  • Linux配置DockerHub镜像源配置
  • HashMap与ConcurrentHashMap详解:实现原理、源码分析与最佳实践
  • 【AI+若依框架】基础应用篇
  • C++string1号
  • 谷歌CEO皮查伊眼中的“下一代平台“与未来图景
  • 华为OD机试_2025 B卷_虚拟游戏理财(Python,100分)(附详细解题思路)
  • 【数据分析】第二章 Python基础