7

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

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

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

4

7 回答 7

4

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

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

于 2009-05-11T13:02:20.153 回答
2

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

于 2009-05-11T11:46:44.327 回答
2

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

于 2009-05-11T14:10:43.087 回答
1

通常的方法是给库赋予不同的名称或将它们存储在不同的目录中,例如 Debug 和 Release。如果你的构建是正确自动化的,我看不出你怎么会犯错误。

于 2009-05-11T11:52:41.437 回答
1

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

objdump -g mylib.a

如果您只得到空行或以目标文件名开头的行,那么您在库中没有调试信息。

请注意,这通常并不意味着该库是“发布”或“调试”,但在您的情况下可能意味着它。

于 2009-05-11T12:22:13.523 回答
0

通常人们会使用稍微不同的名称来区分版本。例如,在调试版本下,所有库在其扩展名之前都以字符“d”为后缀。前任。commonUtilsd.lib在发布模式下也是如此commonUtils.lib。恕我直言,这种方法更简单,更清洁。在 MSVC 中使用可以在下指定输出文件名

Librarian-->General-->Output File

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

于 2009-05-11T11:50:47.777 回答
0

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

using System.Diagnostics;

FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(fileName);
return fvi.IsDebug;
于 2017-03-17T14:09:12.287 回答