【问题标题】:How to know library is debug library or release?如何知道库是调试库还是发布?
【发布时间】:2011-03-24 07:43:26
【问题描述】:

我正在使用 mysql cpp 库。 我从那里检查最近的副本 bzr trunk 和 使用 cmake 生成库。

我第一次使用发布模式,第二次使用调试模式进行构建。 这两个库都有

a mysql_debug.cpp
U mysql_debug

有没有办法检查程序(C 或 C++ 代码)或使用 nm 该库是 Release 库或 Debug 库

【问题讨论】:

  • 发布与调试问题是特定于 Windows 的。在 linux 下不应该存在二进制不兼容问题。
  • @ Alexandre C 但我遇到了奇怪的问题,如果我与 mysql cpp 的发布版本链接,程序会随机崩溃,但如果我将它与调试程序链接。它工作正常。
  • 您可以在构建两个库时为它们指定不同的名称。
  • @Alexandre:发布与调试与 Windows 无关。这些只是 Visual Studio 在您创建项目时为您创建的默认配置名称。这些示例配置之间的区别在于运行时检查代码的数量,由 /RTC 指定。每个编译器都应该可以进行这样的设置。
  • @harper 是的,但是还有一个额外的问题是你在 windows 下链接的运行时库的版本,以及在“调试”和“发布”模式下 STL 类之间的二进制不兼容。在 linux 下,通常不存在这种不兼容性,至少对于标准库来说是这样(这里的情况可能有所不同,因为给定库的调试版本可能会在类中存储额外的信息)。

标签: c++ c mysql-connector mysql-connect


【解决方案1】:

我看到了 nm 的误报,所以我不相信它。当我想检查目标文件是否有调试信息时,我在目标文件或库上运行 objdump -x 并查看是否有标有 dbg、stabs 或 dwarf 的标头。这无论如何都不是最优雅的解决方案,但它从来没有错,而且当你有一个调试版本和发布版本进行比较时,很容易看出差异。

【讨论】:

    【解决方案2】:

    执行 objdump -x ,将输出存储在文件中并搜索 dll 。如果您看到该库与 Windows 发布库链接,则说明其发布版本,否则为调试版本。

    【讨论】:

      【解决方案3】:

      调试和发布版本之间的差异通常是由于无效代码的优化方式不同,而不是不兼容,因此其中一个工作而另一个不工作是纯粹的运气(也可能是相反的方式) .

      valgrind 下运行程序,看看它是否标记了任何非法访问。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-31
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        相关资源
        最近更新 更多