1. 程式人生 > >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;
}


執行結果如下:


參考文獻:

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