我们的项目使用许多静态库来构建应用程序。我们如何确保我们在应用程序的发布版本中使用发布版本的库?
我们通过在发布应用程序构建中使用调试库来犯错误。
我正在寻找一种优雅的方式来编写模块,以便我们可以检查特定库是发布还是调试,如果不匹配则报告它。我们的应用程序是用 C/C++ 编写的。(平台 MSVC 和 GCC)
我们的项目使用许多静态库来构建应用程序。我们如何确保我们在应用程序的发布版本中使用发布版本的库?
我们通过在发布应用程序构建中使用调试库来犯错误。
我正在寻找一种优雅的方式来编写模块,以便我们可以检查特定库是发布还是调试,如果不匹配则报告它。我们的应用程序是用 C/C++ 编写的。(平台 MSVC 和 GCC)
是的。您可以检查文件结构的Characteristics
字段。IMAGE_FILE_HEADER
如果库是发布版本,则将DEBUG_STRIPPED
设置位 0x0200 ( );在调试版本中,它会很清楚。
您可以在网络上的各个地方(例如此处)找到有关 Windows EXE 和 DLL 使用的 PE 格式的技术信息,以了解如何检索该结构。
您不能使用命名约定(即foo_rel.a
和foo_dbg.a
)解决这个问题吗?
有一个返回库版本的简单函数怎么样?根据您正在调试或发布的构建返回不同的内容。在您的应用程序开始时调用该函数并报告错误。
通常的方法是给库赋予不同的名称或将它们存储在不同的目录中,例如 Debug 和 Release。如果你的构建是正确自动化的,我看不出你怎么会犯错误。
抛开命名约定不谈,如果您使用的是类 unix 系统,您可能可以解析以下输出:
objdump -g mylib.a
如果您只得到空行或以目标文件名开头的行,那么您在库中没有调试信息。
请注意,这通常并不意味着该库是“发布”或“调试”,但在您的情况下可能意味着它。
通常人们会使用稍微不同的名称来区分版本。例如,在调试版本下,所有库在其扩展名之前都以字符“d”为后缀。前任。commonUtilsd.lib
在发布模式下也是如此commonUtils.lib
。恕我直言,这种方法更简单,更清洁。在 MSVC 中使用可以在下指定输出文件名
Librarian-->General-->Output File
另一个建议是将这些输出文件放在配置目录中。即在Debug 文件夹中有debug-version,在Release 文件夹下有release-versions。同样在 MSVC 下,这通常可以使用 $(ConfigurationName) IDE 宏来完成。并在构建期间在查找目录中附加正确的路径。
我使用并成功测试了这段代码:
using System.Diagnostics;
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(fileName);
return fvi.IsDebug;