我们的项目使用许多静态库来构建应用程序。我们如何确保在发布版本的应用程序中使用发布版本的库?
我们通过在发布应用程序构建中使用调试库来犯错误。
我正在寻找一种优雅的方式,我可以编写一个模块,我们可以检查特定的库是否发布或调试,如果不匹配则报告它。我们的应用程序是用C / C ++编写的。 (平台MSVC和GCC)
答案 0 :(得分:4)
是。您可以查看文件Characteristics
结构的IMAGE_FILE_HEADER
字段。如果库是发布版本,则将设置位0x0200(DEBUG_STRIPPED
);在调试版本中,它将很清楚。
您可以在'网络上的各个位置(例如here)找到有关Windows EXE和DLL使用的PE格式的技术信息,以了解如何检索该结构。
答案 1 :(得分:2)
你能否使用命名约定解决这个问题(即foo_rel.a
和foo_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;