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

Joh*_*ski 4 c c++ versioning

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

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

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

Ele*_*tal 6

我将假设您使用的是静态库,而二进制代表的是一个将在编译时链接的.lib(与运行时可能不匹配的dll或类似物相对).

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

#ifdef _RELEASE //or whatever your compiler uses
#define InitialiseLibrary InitialiseLibraryRelease
#else
#define InitialiseLibrary InitialiseLibraryDebug
#endif
Run Code Online (Sandbox Code Playgroud)

同样在库的cpp文件中:

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

现在在使用该库的主exe:

InitialiseLibrary();
Run Code Online (Sandbox Code Playgroud)

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

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