我有一个烦人的问题,我可能能够以某种方式规避它,但另一方面,我宁愿在它之上并了解到底发生了什么,因为看起来这些东西真的会留下来。
故事是这样的:我有一个简单的 OpenGL 应用程序,它运行良好:在编译、链接或运行它时从来没有出现过大问题。现在我决定尝试将一些更密集的计算转移到工作线程中,以便可能使 GUI 响应更快——当然是使用 Boost.Thread。
简而言之,如果我在 .cpp 文件的开头添加以下片段:
#include <boost/thread/thread.hpp>
void dummyThreadFun() { while (1); }
boost::thread p(dummyThreadFun);
,然后我在尝试启动调试版本时开始收到“此应用程序无法启动,因为未找到 MSVCP90.dll”。(发布模式工作正常。)
现在查看使用 Dependency Walker 的可执行文件,他也没有找到这个 DLL(我猜这是预期的),我可以看到我们正在寻找它以便能够调用以下函数:
?max@?$numeric_limits@K@std@@SAKXZ
?max@?$numeric_limits@_J@std@@SA_JXZ
?min@?$numeric_limits@K@std@@SAKXZ
?min@?$numeric_limits@_J@std@@SA_JXZ
接下来,我尝试转换每个实例min
并max
改为使用宏,但可能找不到对它们的所有引用,因为这没有帮助。(我正在使用一些我没有可用源代码的外部库。但即使我能做到这一点——我认为这真的不是正确的方法。)
所以,我的问题——我猜——是:
- 即使使用调试版本,为什么我们还要寻找非调试 DLL?
- 解决问题的正确方法是什么?或者甚至是一个快速而肮脏的?
我首先在 Visual Studio 2008 的普通安装中安装了这个。然后尝试安装 Feature Pack 和 SP1,但它们也没有帮助。当然也尝试过多次Rebuild。
我正在为 Boost (v1.36.0) 使用预构建的二进制文件。这不是我第一次在这个项目中使用 Boost,但它可能是我第一次使用基于单独源的部件。
禁用增量链接没有帮助。该程序是 OpenGL 的事实似乎也不相关——当我将相同的三行代码添加到一个简单的控制台程序中时,我遇到了类似的问题(但它抱怨 MSVCR90.dll 和_mkdir
,当我替换后者boost::create_directory
,问题消失了!!)。它实际上只是分别删除或添加使程序运行正常或根本不运行的那三行。
我不能说我理解并排(甚至不知道这是否相关,但这是我现在的假设),老实说,我也不是很感兴趣——只要我能构建、调试和部署我的应用程序...
编辑 1:在尝试构建一个能够重现问题的精简示例时,我发现该问题与Spread Toolkit有关,它的使用是我所有遇到此问题的程序的共同因素。(但是,在开始链接 Boost 内容之前,我从未有过这个。)
我现在想出了一个最小的程序,可以让我重现这个问题。它由两个编译单元A.cpp和B.cpp组成。
A.cpp:
#include "sp.h"
int main(int argc, char* argv[])
{
mailbox mbox = -1;
SP_join(mbox, "foo");
return 0;
}
B.cpp:
#include <boost/filesystem.hpp>
一些观察:
- 如果我注释掉
SP_join
A.cpp 行,问题就消失了。 - 如果我注释掉 B.cpp 的单行,问题就消失了。
- 如果我将 B.cpp 的单行移动或复制到 A.cpp 的开头或结尾,问题就会消失。
(场景2和3,调用时程序崩溃SP_join
,但那只是因为邮箱无效......这与手头的问题无关。)
此外,Spread 的核心库已链接,这肯定是我的问题 #1 答案的一部分,因为我的系统中没有该库的调试版本。
目前,我正在尝试提出一些可以在另一个环境中重现该问题的方法。(尽管如果它真的可以在我的场所之外重复,我会感到非常惊讶......)
编辑 2:好的,所以现在我们有一个包,我可以使用它在 WinXP32 + VS2008 + Boost 1.36.0 的几乎普通安装上重现该问题(仍然是来自 BoostPro Computing 的预构建二进制文件)。
罪魁祸首肯定是 Spread 库,我的构建不知何故需要一个用于MSVC 6的相当古老的 STLPort 版本!尽管如此,我仍然觉得这些症状比较有趣。此外,很高兴听到您是否可以真正重现该问题 - 包括上面的场景 1-3。包装很小,应该包含所有必要的部件。
事实证明,这个问题与 Boost.Thread 没有任何关系,因为这个例子现在使用了 Boost Filesystem 库。此外,它现在抱怨 MSVCR90.dll,而不是以前的 P。