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

标签 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++ - 确保相同的配置用于库和可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4850578/

相关文章:

jsf - 如何强制浏览器重新加载 h :outputScript resource?

c++ - 我如何在 TinyXML 中获取标签的名称?

c++ - 如何为 Solaris 和 HP-AIX 定义 _FILE_OFFSET_BITS & _LARGE_FILES 宏

c - 错误 C2059 : syntax error :"->" and ";"

c - 如何以编程方式在 OpenSSL 中加载 PKCS#12 文件?

c++ - 在 C/C++ 中的特定地址边界上对齐内存是否仍能提高 x86 性能?

silverlight - 确定我的 Silverlight 应用程序的版本

c++ - WinAPI 单击按钮时没有任何反应

c++ - 从数组的共享指针访问共享指针

maven-2 - 如何在maven中发布依赖于第3方SNAPSHOT项目的项目