确保相同的配置用于库和可执行文件

时间:2011-01-31 11:57:53

标签: c++ c versioning

假设我正在将库分发为二进制文件。它有两个版本,调试和发布。调试和发布彼此不兼容,因此,例如,用户构建一个发布可执行文件,他/她必须与发布库链接。

如果库和可执行版本之间存在不匹配,那么目前会出现一些很难弄清楚的细微错误。我希望显示一个非常明确的错误消息,通知不匹配,最好是在链接时。

实现这一目标的好方法是什么?

3 个答案:

答案 0 :(得分:6)

我将假设您正在使用静态库,并且通过二进制文件表示将在编译时链接的.lib(与在运行时可能不匹配的dll或类似物相对)。

对我而言,最简单的方法是在.h文件中使用这种构造

#ifdef _RELEASE //or whatever your compiler uses
#define InitialiseLibrary InitialiseLibraryRelease
#else
#define InitialiseLibrary InitialiseLibraryDebug
#endif

同样在库的cpp文件中:

#ifdef _RELEASE //or whatever your compiler uses
void InitialiseLibraryRelease() 
{
  CommonInitialise();
}
#else
void InitialiseLibraryDebug() 
{
  CommonInitialise();
}
#endif

现在在使用该库的主exe:

InitialiseLibrary();

如果库和exe的发布不匹配,则链接器将报告不匹配一个或其他InitialiseLibrary ...函数。

另一种选择是确保发布和调试库编译为不同命名的文件,然后使用.h文件中的#pragma使链接工作(而不是在项目中明确包含库)。 使用上面的#ifdef,您可以在编译时选择要链接的库,方法是选择使用哪个#pragma。第二种技术并没有完全解决你的问题(因为它不会阻止程序员试图强制它发生的链接),但它是处理这种困难的常规方法(并且在复杂的构建环境中具有优势)

答案 1 :(得分:0)

还可以检查安装脚本中的二进制文件/库。不过,这不是答案。

答案 2 :(得分:-1)

使用#error指令,将中止编译:

#ifndef RELEASE_VERSION
#error Release version required
#endif