C++ 如何识别库是调试版本还是发布版本?

C++ 如何识别库是调试版本还是发布版本?,c++,C++,我们的项目使用许多静态库来构建应用程序。我们如何确保在应用程序的发布版本中使用库的发布版本 我们在发布应用程序构建中使用调试库是在犯错误 我正在寻找一种优雅的方式来编写一个模块,我们可以检查一个特定的库是发布的还是调试的,如果不匹配就报告它。我们的应用程序是用C/C++编写的。(平台MSVC和GCC)您不能使用命名约定(即foo_rel.a和foo_dbg.a)来解决这个问题吗?通常人们会使用稍微不同的名称来区分版本。例如,在“调试生成”下,所有库的扩展名前都有一个字符“d”作为后缀。例如,co

我们的项目使用许多静态库来构建应用程序。我们如何确保在应用程序的发布版本中使用库的发布版本

我们在发布应用程序构建中使用调试库是在犯错误


我正在寻找一种优雅的方式来编写一个模块,我们可以检查一个特定的库是发布的还是调试的,如果不匹配就报告它。我们的应用程序是用C/C++编写的。(平台MSVC和GCC)

您不能使用命名约定(即
foo_rel.a
foo_dbg.a
)来解决这个问题吗?

通常人们会使用稍微不同的名称来区分版本。例如,在“调试生成”下,所有库的扩展名前都有一个字符“d”作为后缀。例如,
commonUtils.lib
在释放模式下,相同的将是
commonUtils.lib
。这种方法更简单、更干净。在MSVC中,用户可以指定下的输出文件名

Librarian-->General-->Output File

另一个建议是将这些输出文件放在配置目录中。i、 e.在调试文件夹中有调试版本,在发布文件夹下有发布版本。同样,在MSVC下,通常可以使用$(ConfigurationName)IDE宏完成此操作。并在构建过程中在查找目录中附加正确的路径。

通常的方法是eithr为库指定不同的名称或将它们存储在不同的目录中,如Debug和Release。如果您的构建是正确自动化的,我看不出您会如何出错。

撇开命名约定不谈,如果您使用的是类unix系统,您可能可以解析以下输出:

objdump -g mylib.a
如果只获得空行或以对象文件名开头的行,则库中没有调试信息


请注意,这通常并不意味着库是“release”或“debug”,但在您的情况下可能意味着它。

是。您可以检查文件的
图像\u文件头的
特征
字段。如果库是发布版本,则将设置位0x0200(
DEBUG\u
);在调试构建中,它将是清晰的


您可以在“网络”上的不同位置找到Windows EXE和DLL使用的PE格式的技术信息,以了解如何检索该结构(例如)。

使用一个简单的函数返回库的版本如何?根据正在调试或发布的构建返回不同的内容。在应用程序开始时调用该函数并报告错误。

我使用并成功测试了以下代码:

using System.Diagnostics;

FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(fileName);
return fvi.IsDebug;

您可能想添加您正在使用的工具链和平台,例如MSVC、GCC?库中是否有某种指示器指示它们是发布还是调试构建?比所有其他垃圾建议简单得多。如果调试符号在PDB中,我无法区分调试和发布。我在调试中编译了一个C++ DLL(调试符号被剥离到PDB)和发布模式,调试的BIT位无法区分它。假设你继承了一堆库,而你不知道它们是如何构建的。没有链接它们并等待失败,有没有办法找到答案?