0

我正在为几个 C++ 项目使用 boost。我最近进行了升级(从 1.33.1 升级到 1.36,很快升级到 1.37),从那时起我就不能再运行任何调试版本了。

为确保不存在其他项目问题,我创建了一个最小测试项目,其中仅包含 boost.thread,并使用它来启动一种方法。可以启动发布构建,但不能启动调试构建,尽管Dependency Walker显示找到了所有必需的库(这也意味着在 SxS 目录中找到了所需的 MS Debug CRT)。

在启动时我只得到:

Die Anwendung konnte nicht Richtig initialisiert werden (0xc0150002)。Klicken Sie auf "OK", um die Anwendung zu beden。

这意味着“无法初始化应用程序”。互联网研究主要导致MS Office 安装问题,建议对 WinXP 进行修复。

那么,除了修复设置(我认为这在我谈论调试 dll 问题时无济于事)之外,还有什么想法吗?

啊,在我忘记之前:完全相同的源代码在构建机器上不会导致错误(即,可以注册 DLL,意味着执行)。所以这显然是一个安装问题,但是由于 DLL那里,并且dependency-walker 找到了它,我还忘记了什么?

编辑)好吧,我还没有解决我的问题,但感谢 deemok,我更进一步。为了减少误解,我在下面做一些澄清:

  • 程序无法在开发者机器上运行
  • 我正在使用已安装的 VS2005(这是一个 VC++8 项目)
  • 我使用了来自BoostPro的 boost-setup ,编译了所有可能的构建版本,并仔细检查了它们是否存在(否则我在构建过程中已经遇到了链接器错误)。
  • 我仔细检查了我能想到的 include/lib/bin 配置的任何角落——因为 boost 在 Windows 上使用自动链接,具有特殊的命名约定,构建或启动会失败,更容易理解错误信息。
  • 不能使用静态链接,因为 boost.thread 需要动态链接 DLL 项目(我可能会在这里搞砸,但由于这个问题似乎只发生在我的机器上,我不想搞砸这个,我确定助推器首先有理由将检查放在那里)
  • 正如我写的那样,我检查了 Dependency Walker,它说一切都很好。

目前,它似乎是 boost-dll 中的一个错误(可能是不正确的 Manifest),将对其进行检查。

4

4 回答 4

3

这是一个并行(SxS) 问题——仅仅复制 DLL 已经不够了。

关于您关于 Debug 构建的具体问题,请参阅:Running vc2008 debug builds on non-dev machines

简短的回答:

你不能,因为调试运行时没有安装程序 redist(实际上软件许可证禁止分发它,所以即使你确实把一些东西放在一起,你也会违反 EULA)。

因此,您需要在那里安装 Visual Studio。

但是,如果您仍然想尝试不走那条路,您可以完整阅读puetzk 的答案

或者,您可以尝试静态链接所有内容

于 2009-01-13T17:09:22.223 回答
1

这可能与 SxS 无关。我建议检查事件日志中的 SxS 错误消息并使用依赖遍历器检查最可能的 DLL 依赖问题,或者其中一个 DLL 从其 DllMain 返回 FALSE(无论出于何种原因)。

此外,启用加载程序快照:

gflags -i yourapp.exe +sls

在调试器(或依赖walker)下运行时可能会带来额外的启发。

注意:gflags 是Windows 调试工具的一部分。

于 2009-01-13T18:04:41.143 回答
1

那么您使用的是BoostPro的预构建库吗?如果是这样,您的环境可能与它们内置的环境略有不同(TR1 功能包与否等)。也许最好尝试在您的特定环境中构建 Boost 自己。

于 2009-01-13T21:31:50.773 回答
0

让自己成为依赖步行者。在其中打开您的应用程序 exe。它将向您显示您的应用程序需要但无法加载/访问的所有 dll。

如果这还不够,您还可以使用dependency walker 分析您的应用程序,这将为您提供大量输出以找出问题所在。

[编辑] 因为您只有调试版本存在问题:确保在升级 boost 时,不仅重建了发布二进制文件,还重建了 boost 的调试二进制文件。当然,请确保调试版本是使用与您现在使用的相同版本的 VisualStudio 构建的。

并确保包含路径(工具->选项->项目和解决方案->VC++目录)是正确的:最新的boost版本的路径必须在那里,而不是旧版本的路径。

于 2009-01-13T17:40:59.117 回答