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; }
執行結果如下:
參考文獻:
http://www.cnblogs.com/gulvzhe/archive/2012/06/27/2565983.html