【问题标题】:How to identify if a library is DEBUG or RELEASE build?如何识别库是 DEBUG 还是 RELEASE 构建?
【发布时间】:2017-03-17 22:12:49
【问题描述】:

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

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

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

【问题讨论】:

  • 您可能想要添加您正在使用的工具链和平台,例如MSVC,海合会?
  • 库中/库中是否有某种指示器表明它们是发布还是调试版本?

标签: c++


【解决方案1】:

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

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

【讨论】:

  • 如果调试符号在 PDB 中,我无法区分 DEBUG 和 RELEASE。我在调试(调试符号被剥离到 PDB)和发布模式下编译了一个 C++ dll,并且 DEBUG_STRIPPED 位无法区分它。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 比所有其他垃圾建议的要简单得多。
    【解决方案4】:

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

    【讨论】:

    • 假设您继承了一堆库,但您不知道它们是如何构建的。如果没有链接它们并等待失败,有没有办法找出来?
    【解决方案5】:

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

    objdump -g mylib.a
    

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

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

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

        using System.Diagnostics;
        
        FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(fileName);
        return fvi.IsDebug;
        

        【讨论】:

          猜你喜欢
          • 2010-10-22
          • 2012-06-05
          • 2015-06-25
          • 1970-01-01
          • 2017-05-10
          • 2013-03-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多