【问题标题】:How to debug application when third-party library provides no debug build?第三方库不提供调试构建时如何调试应用程序?
【发布时间】:2010-02-15 20:48:20
【问题描述】:

我正在开发一个应用程序,它使用两个第三方库,每个库都有预编译的库和 dll,其中一个为调试和发布版本 (A[d].lib) 和其他只为发布版本提供 .lib 文件 (B.lib)。

在发布模式下编译(使用 MSVC9)工作正常,但尝试在调试模式下编译失败,因为第三方 A 需要 LIBCMTD.lib(或 MSVCRTD.lib)而第三方 B 需要 LIBCMT.lib(或MSVCRT.lib)。

我可以解决这个问题还是我在发布模式下无法调试?

【问题讨论】:

    标签: c++ debugging visual-c++ linker


    【解决方案1】:

    您想要完全调试模式,还是只想能够调试?如果是后者,只需转到链接器选项,然后打开符号信息 (.pdb) 的生成。通过这种方式,您可以在自己的代码中使用调试器,逐行查看变量。如果您对优化器创建的控制流更改感到恼火,您可以转到编译器选项并关闭优化。这样您就可以使用调试器并在发布模式下构建。一旦您对代码感到满意,您只需将设置更改回创建优化代码。

    【讨论】:

    • 实际上,我会从相反的一端开始:只需采用现有的调试配置,并链接到 LIBCMT.lib、A.lib 和 B.lib。但要点是一样的:创建一个未优化的可执行文件,具有调试信息,但链接到发布库。
    • @Carsten:是的,我想要完整的调试,最后我选择了你和 MSalters (+1!) 的方法。感谢您的建议!
    【解决方案2】:

    尝试将/NODEFAULTLIB:LIBCMT 传递给链接器。

    【讨论】:

    • 有了你提到的标志,我得到了error LNK2001: unresolved external symbol __invalid_parameter_noinfo(因为B需要它)。
    • Google 似乎在预处理器中使用_SECURE_SCL=0 来解决这个问题。
    • 我尝试了涉及 _SECURE_SCL 的其他解决方案的各种组合,但均无济于事。
    【解决方案3】:

    我不确定它是否可以直接使用静态库来完成。我建议你将库 B 打包成一个动态库,然后使用这个新的 B' 库。您的问题将会消失。

    【讨论】:

    • 这对于生产软件来说绝对是一个很好的解决方案,一旦一切都解决了,现在看来太麻烦了,不过谢谢!
    猜你喜欢
    • 2017-06-27
    • 2011-06-14
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    相关资源
    最近更新 更多