首页 > 系统相关 >linux 动态库 版本号,软链接SONAME的编译选项

linux 动态库 版本号,软链接SONAME的编译选项

时间:2022-11-10 16:46:59浏览次数:67  
标签:SONAME 版本号 libhello so.0 so linux hello name

摘自:https://www.csdn.net/tags/MtTaEgysMzQ2MDMtYmxvZwO0O0OO0O0O.html

Linux下动态库有三个名字:real name、so name、link name。

  • real name:共享库本身的名字,命名格式为libname.so.x.y.z,lib是前缀,name是共享库的名字,so是后缀,x是主版本,y是次版本号,z是发布版本号。

         主版本号、次版本号和发布版本号的意义如下:

  1. 主版本号:表示库的重大升级,比如改变了原有的接口。不同主版本号的库是不兼容的,要保证向下兼容就不能删除旧版本的动态库。
  2. 次版本号:表示库的增量升级,比如增加了新的接口,但原有接口保持不变。高的次版本号的库向下兼容低的次版本号的动态库,原有的版本库是可以不保留的。
  3. 发布版本号:表示指示改正了一些错误或者是性能优化等,接口没有增加,也没有改变,因此也是向下兼容的。
  • so name:是通过ldconfig命令,来创建的指向真正的动态库(real name)的链接,so name的命名规则是,real name去掉次版本号和发布版本号,格式为libname.so.x。
  • link name:是so name的软链接,命名规则是,real name去掉主版本号、次版本号和发布版本号,格式为libname.so,编译时,通过参数-lname来链接。

下面通过实际的例子来说明动态库的编译和链接:

首先,建立hello.c和hello.h两个文件,然后将他们编译成动态链接库。

hello.c文件:

#include <stdio.h>

void hello (void)
{
    printf("Hello, library world.\n");
}

hello.h文件:

#ifndef __HELLO_H__
#define __HELLO_H__

void hello (void);

#endif

执行如下命令,编译生成共享库

$gcc hello.c -fPIC -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0.0

编译完成后,只生成了libhello.so.0.0.0,并未生成libhello.so.0,若要生成libhello.so.0需要做如下操作:

在/etc/ld.so.conf文件中指定库的路径,在文件中添加:libhello.so.0.0.0这个库所在的绝对路径。

执行如下命令生成libhello.so.0:

$sudo ldconfig

下面需要为libhello.so.0建立一个软链接,方便编译应用程序是链接,执行如下命令:

$ln -s libhello.so.0 libhello.so

然后,编写应用程序来调用动态库。

main.c文件:

#include "hello.h"

int main(void)
{
    hello();
    
    return 0;
}

执行下面的命令编译生成main的可执行文件:

$gcc main.c -L. -lhello -o main

注:没有重大升级(主版本号未更改),编译新版本的动态库后,执行$sudo ldconfig就可以进行动态库的升级。如果进行重大升级(更改主版本号),编译新版本的动态库后,执行$sudo ldconfig,生成新的so name文件,再执行$ln -s libhello.so.1 libhello.so(主版本号升级为1).如果想重新恢复为旧版本的动态库,只需要执行$ln -s libhello.so.0 libhello.so

标签:SONAME,版本号,libhello,so.0,so,linux,hello,name
From: https://www.cnblogs.com/LiuYanYGZ/p/16877569.html

相关文章

  • Linux下查找并杀死 zombile 和 stopped 进程
    用top命令查看系统运行情况,突然发现stopped和zombile进程个数居然不是0。[root@myossoftware]#toptop-11:20:17up60days,17:15,3users,loadaverage:0.0......
  • Linux上查看网络带宽的18个常用命令
    Linux上查看网络带宽的18个常用命令:​按照功能进行划分:​监控总体带宽的使用:nload、bmon、bwm-ng、cbm、speedometer和netload​监控总体带宽的使用(批量式输出):vnstat、ifs......
  • Linux基础知识(9)- Git 简单使用(一)
    GIT,全称是分布式版本控制系统,Git支持分布式部署,可以有效、高速的处理从很小到非常大的项目版本管理。分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者......
  • linux安装java
    1.在/usr下新建java2.上传安装包到java,并解压tar-xvfjdk....tar.gz3.ln-s/usr/java/jdk1.8.0_351/usr/jdk 设置链接,节约目录长度4.vim/etc/profile 5. 配置......
  • linux 从内存中恢复已删除的文件
    ps-ef|greppython3或者lsof|grep<文件绝对路径>查看打开文件的进程号cd/proc/<进程号>/fd/ll查看当前目录下数字和文件的映射cat<文件对应的数字>><想要恢......
  • Linux 性能优化和内核观察 - CPU 篇(一)
    简介中央处理器(centralprocessingunit,简称CPU)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。所有的计算机程序都运行在CPU之上,在大多数情况下CPU......
  • linux常用硬件故障排查工具之dmesg
      dmesg命令是用来在Unix-like系统中显示内核的相关信息的。dmesg全称是displaymessage(ordisplaydriver),即显示信息。实际上,dmesg命令是从内核环形......
  • Linux安装JDK并配置环境变量
    1.前往JDK官网,地址:https://www.oracle.com/java/technologies/downloads/下载需要的版本(优先java8)   2. 使用cd进入指定目录下,使用mkdir新建一个文件夹,继续使......
  • [ Linux ] 文件描述符和重定向
    在上篇文章我们复习了C文件IO操作并且认识了文件相关的系统调用接口。本篇文章我们要引入文件描述符的概念。0.文件描述符0.1引入文件描述符我们在认识open接口时知道了该接......
  • 如何优雅的在Linux下开机自动重启脚本
    1简介经常碰到机器断电之后需要重启一大堆服务,为了防止这种事情发生,设置开机自启的脚本十分的重要,我们习惯性的做法就是编写一个重启脚本,然后在 /etc/rc.local 中去完......