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
- SO库版本号管理
- 动态库版本号管理
- linux动态库版本号管理
- linux动态库版本号管理
- linux动态库版本号管理
- 如何查看so版本号
- linux下如何查看共享库so版本号
- 【转】版本号管理
- 版本号管理(二)
- 软件版本号管理
- 版本号管理(转)
- 版本号管理(转)
- 版本号管理(转)
- 软件版本号管理
- 版本号规范管理
- C#版本号管理
- maven版本号管理
- 程序集版本号,文件版本号及发布版本号管理
- cas技术总结
- Java NIO系列教程(二) Channel
- [Android] 浅析总结 AS 中 Gradle 配置运行
- Tomcat启用HTTPS协议配置过程
- design的常用样式
- SO库版本号管理
- Tomcat设置https协议(本地测试)
- 数据结构实验之二叉树六:哈夫曼编码
- ArrayBlockingQueue跟LinkedBlockingQueue的区别
- linux设备驱动归纳总结(十二):简单的数码相框
- 3. [netty-RPC]--服务端程序设计
- 布局中嵌套listview和edittest焦点问题
- 超分辨率重重建——流形学习
- Dagger2学习笔记之dependencies