使用发布 CRT 在调试中构建应用程序,但在 boost 上存在依赖问题

Posted

技术标签:

【中文标题】使用发布 CRT 在调试中构建应用程序,但在 boost 上存在依赖问题【英文标题】:Building application in debug with release CRT with dependency issues on boost 【发布时间】:2012-06-17 20:55:51 【问题描述】:

我正在构建一个依赖于 boost 的应用程序。我的应用程序输出是最终被另一个客户端应用程序使用的库。我最近发现我正在使用 /MDd 以调试模式构建我的应用程序以生成代码(调试 CRT 库),并且即使在调试模式下,客户端应用程序也是针对发布 CRT 构建的。因此,这可能会导致一些内存堆损坏错误。为了确认,我在发布模式下测试了所有内容,一切正常。

为了解决这个问题,我在调试模式下针对 CRT 发布库构建了我的应用程序......但现在我的应用程序(在独立测试中)在运行时失败了。我的理解是这是由于 boost 依赖,并且 boost 调试可能是针对调试 CRT 库构建的?我查看了 boost 文档,但找不到我想要的确切内容……这是如何针对发布 CRT 重建 boost(在调试模式下)?感谢任何帮助/想法/示例。感谢您的宝贵时间!

【问题讨论】:

【参考方案1】:

除了@AlKepp 的回答,我想建议看看Dependency Walker (http://dependencywalker.com/)。它是一个免费工具,可向您显示您的库或应用程序所依赖的库。通常您应该确保仅显示 Microsoft C/C++ 运行时 DLL 的发布版本或调试版本(例如 MSVCP90.DLLMSVCP90D.DLL)。

如果您的应用在运行时加载更多库(例如插件),请使用 Profile->Start ProfilingDependency Walker 运行应用。然后它将向您显示在执行期间实际加载或尝试加载的所有库。

这对解决任何依赖问题都有很大帮助,尤其是在这种意外混合发布和调试版本的情况下。

【讨论】:

谢谢@Johannes:我已经用 Depends 进行了测试,是的,正如预期的那样,两者都出现了。但我也在这里读到social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/…,只要我们完全在第 3 方 DLL(在这种情况下,我的应用程序)中进行分配/解除分配,就应该没问题。因此,例如,通过 DLL 边界将字符串作为 const-ref 传递应该没问题。【参考方案2】:

我过去也遇到过类似的问题。我通过仅使用打开调试功能的发布版本解决了这个问题。您可以更改默认发布配置以生成所有必需的调试信息并省略优化或其中一些,或者您可以创建默认发布配置的克隆,让您拥有原始版本(即真正的发布)和调试-启用发布配置。

【讨论】:

感谢@Kepp,我也尝试过“发布带有调试信息”的构建(就在不久前);但是现在我在测试我的示例时在客户端应用程序中看到了一些奇怪的行为。准确地说,当我将字符串分配为 std::string client_str = some_namespace_in_library::class_name::string_name;我发现 client_str 没有分配,而是保持为空。有什么想法吗??

以上是关于使用发布 CRT 在调试中构建应用程序,但在 boost 上存在依赖问题的主要内容,如果未能解决你的问题,请参考以下文章

在“发布”构建配置中看不到在桥接头中导入的头,但在“调试”构建配置中可见

在发布(dexguard)上构建但在调试中没有出现致命异常

应用程序在发布版本中崩溃但在调试中没有

MSBuild 在调试配置中工作,但在 azure devops 中发布失败

c#程序在VS2010调试中涉及Web Service工作,但在内置发布时不起作用

在调试构建期间禁用 SonarLint 分析