SO库版本号管理

来源:互联网 发布:php数组mergen 编辑:程序博客网 时间:2024/06/06 08:57

一、输入版本号

功能由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;}


运行结果如下:


参考文献:

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

0 0
原创粉丝点击