我不認爲我的問題在這裏已經回答了。所以在這裏,我有一個靜態庫,我定期維護和更新。我也正確更新版本號。現在我的使用這個庫的應用程序必須鏈接到完全相同的庫版本,而不是舊版本或新版本。我嘗試的一件事是在庫頭文件中使用預定義的宏,並在我的應用程序中檢查它。它的工作,但這樣你只能確保正確的頭文件。 是否有任何技術,使鏈接將失敗,如果它是錯誤的庫?我希望這個問題有點清楚。鏈接到正確的庫
哈日
我不認爲我的問題在這裏已經回答了。所以在這裏,我有一個靜態庫,我定期維護和更新。我也正確更新版本號。現在我的使用這個庫的應用程序必須鏈接到完全相同的庫版本,而不是舊版本或新版本。我嘗試的一件事是在庫頭文件中使用預定義的宏,並在我的應用程序中檢查它。它的工作,但這樣你只能確保正確的頭文件。 是否有任何技術,使鏈接將失敗,如果它是錯誤的庫?我希望這個問題有點清楚。鏈接到正確的庫
哈日
我不確定我會推薦它,但是...
標題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()
),那就用它。你可以做一個變量;那麼困難的部分是確保在每個程序中引用該變量。
請注意,更通常的做法是確保跨庫版本的庫接口保持不變,以便程序可以與任何版本鏈接而無需編譯。
謝謝大家。喬納森,你提到的方法似乎是更好的方法。非常感謝喬納森。 – Hari 2010-12-21 07:45:50
所有你需要的是相關的版本號,比如一個獨特的符號:
int version_1_1_5=0;
庫
,並在應用中的一些使用它,例如:
extern int version_1_1_5; //decl
int *p = &version_1_1_5; // use
這裏的難點在於確保用戶始終引用版本變量。頭文件可能會這樣做:'static const int * lib_version =&lib_version_1_1_5;'這樣每個包含頭文件的目標文件都會引用它編譯的庫文件。 – 2010-12-20 08:17:25
不要忘記接受你認爲最有用的答案。這是您在答案分數下看到的複選標記。您應該在您收到一個或多個有用答案(每個問題一個選項)的所有問題上這樣做。 – 2010-12-21 08:09:49