【发布时间】:2011-01-31 11:57:53
【问题描述】:
假设我将一个库作为二进制文件分发。它有两个版本,调试和发布。调试和发布彼此不兼容,所以如果例如用户构建发布可执行文件,他/她必须与发布库链接。
如果库版本和可执行版本之间存在不匹配,目前会出现一些很难发现的细微错误。相反,我想显示一条非常清晰的错误消息,通知存在不匹配,最好是在链接时。
什么是实现这一目标的好方法?
【问题讨论】:
标签: c++ c versioning
假设我将一个库作为二进制文件分发。它有两个版本,调试和发布。调试和发布彼此不兼容,所以如果例如用户构建发布可执行文件,他/她必须与发布库链接。
如果库版本和可执行版本之间存在不匹配,目前会出现一些很难发现的细微错误。相反,我想显示一条非常清晰的错误消息,通知存在不匹配,最好是在链接时。
什么是实现这一目标的好方法?
【问题讨论】:
标签: c++ c versioning
我将假设您使用的是静态库,二进制是指将在编译时链接的 .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 来选择要链接的库。第二种技术并不能完全解决您的问题(因为如果程序员试图强制它,它不会停止链接的发生)但它是处理此类困难的正常方式(并且在复杂的构建环境中具有优势)
【讨论】:
还可以对安装脚本中的二进制文件/库进行校验和。不过,答案不是 C。
【讨论】:
使用#error 指令,这将中止编译:
#ifndef RELEASE_VERSION
#error Release version required
#endif
【讨论】: