如何识别库是DEBUG还是RELEASE构建?

时间:2009-05-11 11:41:13

标签: c++

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

我们通过在发布应用程序构建中使用调试库来犯错误。

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

7 个答案:

答案 0 :(得分:4)

是。您可以查看文件Characteristics结构的IMAGE_FILE_HEADER字段。如果库是发布版本,则将设置位0x0200(DEBUG_STRIPPED);在调试版本中,它将很清楚。

您可以在'网络上的各个位置(例如here)找到有关Windows EXE和DLL使用的PE格式的技术信息,以了解如何检索该结构。

答案 1 :(得分:2)

你能否使用命名约定解决这个问题(即foo_rel.afoo_dbg.a)?

答案 2 :(得分:2)

通常的方法是为库提供不同的名称或将它们存储在不同的目录中,例如Debug和Release。如果您的构建正确自动化,我无法看到您如何犯错误。

答案 3 :(得分:1)

除了命名约定,如果你使用类似unix的系统,你可以解析输出:

objdump -g mylib.a

如果只获得以对象文件名开头的空行或行,则库中没有调试信息。

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

通常人们会使用稍微不同的名称来区分版本。例如,在调试版本中,所有库在其扩展名之前都带有字符“d”。防爆。 commonUtilsd.lib在发布模式下,commonUtils.lib也一样。这种方法恕我直言更简单,更清洁。在MSVC中,use可以在

下指定输出文件名
Librarian-->General-->Output File

另一个建议是将这些输出文件放在配置目录中。即在Debug文件夹中有debug-version,在Release文件夹下有release-versions。再次在MSVC下,这可以使用$(ConfigurationName)IDE-macro一般完成。并在构建期间在查找目录中附加正确的路径。

答案 6 :(得分:0)

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

using System.Diagnostics;

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