2010-12-20 71 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