2010-12-20 67 views
3

我不認爲我的問題在這裏已經回答了。所以在這裏,我有一個靜態庫,我定期維護和更新。我也正確更新版本號。現在我的使用這個庫的應用程序必須鏈接到完全相同的庫版本,而不是舊版本或新版本。我嘗試的一件事是在庫頭文件中使用預定義的宏,並在我的應用程序中檢查它。它的工作,但這樣你只能確保正確的頭文件。 是否有任何技術,使鏈接將失敗,如果它是錯誤的庫?我希望這個問題有點清楚。鏈接到正確的庫

哈日

+0

不要忘記接受你認爲最有用的答案。這是您在答案分數下看到的複選標記。您應該在您收到一個或多個有用答案(每個問題一個選項)的所有問題上這樣做。 – 2010-12-21 08:09:49

回答

0

我不確定我會推薦它,但是...

標題cou LD包括:

#define LIB_VERSION_SUFFIX _3_17 

#define LIB_PASTER(x, y) x ## y 
#define LIB_EVALUATOR(x, y) LIB_PASTER(x, y) 
#define LIB_FUNCTION(x)  LIB_EVALUATOR(x, LIB_VERSION_SUFFIX) 

#define lib_functionA LIB_FUNCTION(lib_functionA) 

extern int lib_functionA(const char *, int); 

等等

代碼的用戶寫在未修飾的函數名(lib_functionA)方面,而報頭可以確保正確的版本後綴附加。

你不一定要修改每個功能;您確實需要確保將始終使用的某個函數用版本號進行裝飾。如果有初始化功能(可能是lib_init()),那就用它。你可以做一個變量;那麼困難的部分是確保在每個程序中引用該變量。

請注意,更通常的做法是確保跨庫版本的庫接口保持不變,以便程序可以與任何版本鏈接而無需編譯。

+0

謝謝大家。喬納森,你提到的方法似乎是更好的方法。非常感謝喬納森。 – Hari 2010-12-21 07:45:50

2

所有你需要的是相關的版本號,比如一個獨特的符號:

int version_1_1_5=0; 

,並在應用中的一些使用它,例如:

extern int version_1_1_5; //decl 
int *p = &version_1_1_5; // use 
+0

這裏的難點在於確保用戶始終引用版本變量。頭文件可能會這樣做:'static const int * lib_version =&lib_version_1_1_5;'這樣每個包含頭文件的目標文件都會引用它編譯的庫文件。 – 2010-12-20 08:17:25