SO库版本号管理

SO库版本号管理编写SO库文件时可以输入版本号调用SO库文件中特定的函数可以输出版本号

大家好,又见面了,我是你们的朋友全栈君。

一、输入版本号

功能由Cmake软件实现。

1.     建立一个空白txt,重命名为config.h.in。输入代码:

 

#defineMAJOR_VERSION @MAJOR_VERSION@

#defineMINOR_VERSION @MINOR_VERSION@

#defineREVISION_VERSION @REVISION_VERSION@

#defineBUILD_VERSION @BUILD_VERSION@

 

2.     Cmakelists文件中插入

 

set (MAJOR_VERSION3)

set (MINOR_VERSION4)

set (REVISION_VERSION6)

set (BUILD_VERSION2)

 

3.     在工程的.c文件中添加#include “config.h”。config.h文件由Cmake根据config.j.in自动生成。在.c中增加函数void GetProperty(),代码如下:

 

void GetProperty()

{

printf(“Version:%d.%d.%d.%d\n”,MAJOR_VERSION,MINOR_VERSION,REVISION_VERSION,BUILD_VERSION);

}

GetProperty即可打印Cmakelists中设置的版本号信息。

4.     执行Cmake .

5.     执行make

得到.so库文件,该文件含有版本信息输出接口GetProperty。

二、读取版本号

1.     采用dlopen、dlsym、dlclose加载动态链接库

2.     获取GetProperty函数

3.    执行GetProperty函数

property.c的详细代码如下:

#include <stdio.h>
#include <dlfcn.h>

int main(int argc ,char *argv[])
{
    if(argc!=2)
   {
     printf("argument error!you must enter like this:\n");
     printf("./sotest test.so\n");
     return 0;

   }
    void * libm_handle = NULL;
    float (*cosf_method)(float);
    typedef void(*pf_t)();
    char *errorInfo;
    float result;
    
    // dlopen 函数还会自动解析共享库中的依赖项。这样,如果您打开了一个依赖于其他共享库的对象,它就会自动加载它们。
    // 函数返回一个句柄,该句柄用于后续的 API 调用
    libm_handle = dlopen(argv[1], RTLD_LAZY );
    // 如果返回 NULL 句柄,表示无法找到对象文件,过程结束。否则的话,将会得到对象的一个句柄,可以进一步询问对象
    if (!libm_handle){
        // 如果返回 NULL 句柄,通过dlerror方法可以取得无法访问对象的原因
        printf("Open Error:%s.\n",dlerror());
        return 0;
    }
    // 使用 dlsym 函数,尝试解析新打开的对象文件中的符号。您将会得到一个有效的指向该符号的指针,或者是得到一个 NULL 并返回一个错误
    pf_t pf=(pf_t)dlsym(libm_handle,"GetProperty");
    errorInfo = dlerror();// 调用dlerror方法,返回错误信息的同时,内存中的错误信息被清空
    if (errorInfo != NULL){
        printf("Dlsym Error:%s.\n",errorInfo);
        return 0;
    }
    // 执行“cosf”方法
    pf(); 
    // 调用 ELF 对象中的目标函数后,通过调用 dlclose 来关闭对它的访问
    dlclose(libm_handle);
    return 0;
}

运行结果如下:

SO库版本号管理

参考文献:

http://www.cnblogs.com/gulvzhe/archive/2012/06/27/2565983.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149904.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 头文件string与string.h的区别_conio h是什么头文件

    头文件string与string.h的区别_conio h是什么头文件一般一个C++的老的带“.h”扩展名的库文件,比如iostream.h,在新标准后的标准库中都有一个不带“.h”扩展名的相对应,区别除了后者的好多改进之外,还有一点就是后者的东东都塞进了“std”名字空间中。  但唯独string特别。 问题在于C++要兼容C的标准库,而C的标准库里碰巧也已经有一个名字叫做“string.h”的头文件,包含一些常用的C字符串处理函数,比

    2025年11月2日
    3
  • failed to load response data:Request content was evicted from inspector cache

    failed to load response data:Request content was evicted from inspector cache在项目中,我用谷歌浏览器查看后台返回的json数据,但是发现前端页面已经接收成功,并且渲染了对应json数据了,但是network里面的response却报错:调整对应json数据后发现,当后台返回前端的数据超过了一定大小时,就会出现响应截断的问题,不过目前没有找到在哪里设置,我本地是大概超过10m就会截断。谷歌浏览器编辑设置是about:flags,但是我找不到对应设置response的选项。后来发现火狐浏览器可以设置报文响应大小的限制,先在url栏输入about:config,然后选择接受风险并

    2022年5月13日
    89
  • 【教程】Tomcat 的catalina.out 日志按照自定义日期格式进行切割

    本文简单介绍在使用cronolog对tomcat的日志进行自定义日期格式的切割,方便日志的整理和遇到问题日志的排查!安装cronolog安装cronolog的方法网上有很多,这里也简单的介绍一下。1.下载安装包 cronolog-1.6.2.tar.gz2.安装cronolog tar -zxvf cronolog-1.6.2.tar.gz …

    2022年2月26日
    40
  • gmap绘制路径_cad画可见点

    gmap绘制路径_cad画可见点将在地图上用鼠标左键点击的点绘制出来(两点之间用直线连接),并且能够随地图一起实现等比例缩放和拖拽。GMap主要涉及到几个坐标的转换:经纬度与GPoint的转换:GPoint是gMapControl控件坐标,坐标原点(0,0)位于控件的左上角,这个转换用函数FromLatLngToLocal()完成。GPoint与经纬度的转换:将控件坐标转换成经纬度,用函数FromLocalToL

    2025年7月30日
    3
  • linux内核线程「建议收藏」

    linux内核线程「建议收藏」内核经常需要在后台执行一些操作,这种任务就可以通过内核线程(kernlethread)完成,内核线程是独立运行在内核空间的标准进程。内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,mm指针被设置为NULL;它只在内核空间运行,从来不切换到用户空间去;并且和普通进程一样,可以被调度,也可以被抢占。实际上,内核线程只能由其他内核线程创建,linux驱动模块中可以用kernel_threa…

    2022年7月23日
    8
  • Binwalk工具的详细使用说明

    https://blog.csdn.net/QQ1084283172/article/details/66971242一、binwalk工具的基本用法介绍1.获取帮助信息$binwalk-h#或者$binwalk–help2.固件分析扫描$binwalkfirmware.bin#或者$binwalkfirmware.bin|hea…

    2022年4月4日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号