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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python网络编程之基于socket实现聊天机器人

    Python网络编程之基于socket实现聊天机器人

    2022年3月3日
    50
  • 安卓浏览器横评_flash浏览器

    安卓浏览器横评_flash浏览器近日国外媒体AndroidAuthority就对全球使下载最大的11款手机浏览器进行了性能方面的横向评测,相信在看完后,你能够从中找到更适合自己的手机浏览器。(注:本测试主要针对浏览器性能,并不能说明浏览器的整体效果)一、测试设备、工具及浏览器介绍1、测试设备Nexus4,运行Android4.4.2系统。2、测试浏览器本次测试的浏览器总共11款,分别是:-百度浏览器3.1.0.2(国际…

    2025年8月12日
    3
  • 解决树莓派IOError: [Errno Invalid sample rate] -9997 采样率16K错误

    解决树莓派IOError: [Errno Invalid sample rate] -9997 采样率16K错误树莓派在基于pyaudio录音的时候会提示如上错误,这主要是使用的树莓派声卡不支持当前的采用率,没关系,其实在alsa架构下我们可以通过声卡的插件实现转换。在树莓派下家目录创建一个声卡隐藏配置文件 .asoundrc。特别不要在你的pyaudio里面设置打开声卡的编号因为下面的配置以及配置了pcm.!default{typehwcard1}ctl.!default{…

    2022年10月16日
    3
  • 安利一款免费、开源、实时的服务器监控工具:Netdata

    安利一款免费、开源、实时的服务器监控工具:NetdataNetdata是一个免费、开源、实时的服务器监控工具,可以可视化和监控实时数据,如CPU使用率、RAM使用率、负载、SWAP使用率、带宽使用率、磁盘使用率等。它可以帮助系统管理员了解您的系统或应用程序中正在发生的事情以及刚刚发生的事情。它可以安装在任何物理服务器、虚拟机、容器和物联网设备上。它提供了一个交互式Web界面来查看您的服务器指标,并支持用于持久存储的各种数据存储。在本教程中,我们将向您展示如何在AlmaLinux8上安装Netdata监控工具。先决条件运行Alm

    2022年5月9日
    46
  • roslyn 生成代码_delphi反编译为源码

    roslyn 生成代码_delphi反编译为源码Roslyn是微软公司开源的.NET编译器。编译器支持C#和VisualBasic代码编译,并提供丰富的代码分析API。GITHUB地址:https://github.com/dotnet/roslyn.gitRoslyn在vs2013上通过在ManageNuGetPackages中下载安装Microsoft.CodeAnalysis、Microsoft.

    2025年10月10日
    4
  • Django(4)操作指令大全[通俗易懂]

    Django(4)操作指令大全[通俗易懂]前言我们掌握了如何在命令提示符或PyCharm下创建Django项目和项目应用,无论是创建项目还是创建项目应用,都需要输入相关的指令才能得以实现,这些都是Django内置的操作指令。在PyChar

    2022年7月31日
    8

发表回复

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

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