大家好,又见面了,我是你们的朋友全栈君。
一、输入版本号
功能由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
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149904.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...