news 2026/5/23 17:48:50

shared library

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
shared library

原文、

shared library

compatible vs incompatible

compatible library
函数的工作场景没有变化

  • 所有的函数对全局变量和返回参数产生相同的影响
  • 所有的函数继续返回相同的结果值
  • 提升性能 fix bugs
    没有api 被删除
  • 可以有新的api加入
    export 的结构体没有变化
    违反以上各条的library 都是incompatible

library verison and naming

如果新版本的库与老版本的库是兼容的,我们需要修改minor version number
如果新版本的库与老版本的库是不兼容的,我们需要修改major version number

real name

real name 是有库代码的文件的名字
format: libxxxx.so.major-id.minor-id
major-id : 是不断递增的数字 用来标记不兼容的库
minor-id: 用来区分在相同major-id下不同的但是兼容的子版本库
通常情况下,子版本号可以是一个数字或者用点分隔开的两个数字,第一个表示子版本号,第二个表示patch level 或者 revision number

libdemo.so.1.0.1 libdemo.so.1.0.2 libdemo.so.2.0.1 libreadline.so.4.0

soname

format : libname.so.major-id
soname 与realname 有相同的major-id 但没有子版本号
运行时加载只是依赖于主版本号
soname 是符号链接,指向有最近子版本号的库
我们可以更改符号链接到最新版本的库
不同主版本号的库可以共存,可执行程序通过记录他的soname 即可
sample

libdemo.so.1->libdemo.so.1.0.2libdemo.so.2->libdemo.so.2.0.1libreadline.so.4->libreadline.so.4.0

在创建动态链接库的时候,可以给ld 传-soname=name这个参数来指定库的soname,在链接的时候NEEDED中记录的就是soname.

linker name

format: libname.so
目标是能够提供一种版本独立的链接命令,它可以自动选择正确版本的库。
创建符号链接指向realname或者soname

动态加载库

dlopen api:
Four key functions: dlopen(), dlerror(), dlsym(), and dlclose().

/* Usage: dynload lib-path func-name */#include<stdio.h>#include<stdlib.h>#include<dlfcn.h>intmain(intargc,char*argv[]){void*libHandle;/* Handle for shared library */void(*funcp)(void);/* Pointer to function with no args */char*err;if(argc!=3){/* Check command line arguments */fprintf(stderr,"Usage: %s lib-path func-name\n",argv[0]);exit(EXIT_FAILURE);}/* if *//* Load the shared library and get a handle for later use */libHandle=dlopen(argv[1],RTLD_NOW);if(libHandle==NULL){fprintf(stderr,"Error on dlopen: %s\n",dlerror());exit(EXIT_FAILURE);}/* if *//* Get a pointer to named function inside library */(void)dlerror();/* Clear dlerror() *//* The strange cast below is required by C99, which forbids assignment between a function pointer and void * */*(void**)(&funcp)=dlsym(libHandle,argv[2]);err=dlerror();if(err!=NULL){/* Non-NULL from dlerror() means we got error */fprintf(stderr,"Error on dlsym: %s\n",err);exit(EXIT_FAILURE);}/* if *//* If the function address is non-NULL try calling it */if(funcp==NULL)printf("%s is NULL\n",argv[2]);else(*funcp)();/* And close the library */dlclose(libHandle);exit(EXIT_SUCCESS);}/* main */
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 17:48:48

迪士尼交易闭环技术

技术解决方案1. 背景2. 技术架构3. 业务架构3.1 架构图3.2 说明4. 技术能力4.1 自研中间件4.2 定制化中间件5. 领域模型6. 数据模型7. 交易链路8. 状态机8. 接口文档1. 背景 上海迪士尼度假区已运营近10年&#xff0c;度假区交易体系依赖于各家平台&#xff08;携程、去哪儿、…

作者头像 李华
网站建设 2026/5/23 17:48:41

通过curl命令快速测试Taotoken各模型接口连通性与返回格式

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过curl命令快速测试Taotoken各模型接口连通性与返回格式 在模型API的集成与调试阶段&#xff0c;直接使用curl命令进行测试是一种…

作者头像 李华
网站建设 2026/5/23 17:47:39

filer.js核心功能详解:从ls到cp的10个常用API实战

filer.js核心功能详解&#xff1a;从ls到cp的10个常用API实战 【免费下载链接】filer.js A wrapper library for the HTML5 Filesystem API what reuses UNIX commands (cp, mv, ls) for its API. 项目地址: https://gitcode.com/gh_mirrors/fi/filer.js filer.js是一个…

作者头像 李华
网站建设 2026/5/23 17:43:27

分享噪音测试分贝仪 精准测噪 数据直观超实用

楼主评价&#xff1a;噪音测试分贝仪[顶!]精准测噪[顶!]数据直观超实用软件名称&#xff1a;噪音测试分贝仪软件版本&#xff1a;v4.4.9软件大小&#xff1a;24m测试平台:红米Note 12T Pro/澎湃2/安卓15官方介绍&#xff1a;噪音测试分贝仪是一款十分实用的工具。用户能够在此测…

作者头像 李华
网站建设 2026/5/23 17:41:56

HS2-HF补丁:Honey Select 2终极增强与汉化一键解决方案

HS2-HF补丁&#xff1a;Honey Select 2终极增强与汉化一键解决方案 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF补丁是《Honey Select 2》游戏的终极增…

作者头像 李华
网站建设 2026/5/23 17:41:00

戴森球计划工厂蓝图库:3000+精选设计快速打造太空工业帝国

戴森球计划工厂蓝图库&#xff1a;3000精选设计快速打造太空工业帝国 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints蓝图库是戴森球计划玩家的终极生产力…

作者头像 李华