假设我正在将库分发为二进制文件。它有两个版本,调试和发布。调试和发布彼此不兼容,因此,例如,用户构建一个发布可执行文件,他/她必须与发布库链接。
如果库和可执行版本之间存在不匹配,那么目前会出现一些很难弄清楚的细微错误。我希望显示一个非常明确的错误消息,通知不匹配,最好是在链接时。
实现这一目标的好方法是什么?
答案 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