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


相关推荐

发表回复

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

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