我有一个令人烦恼的问题,我可能会以某种方式规避,但另一方面更愿意在它上面,并了解究竟发生了什么,因为看起来这个东西真的要留下来.
这是故事:我有一个简单的OpenGL应用程序可以正常工作:从来不是编译,链接或运行它的主要问题.现在我决定尝试将一些更密集的计算转移到工作线程中,以便可能使GUI更具响应性 - 当然,使用Boost.Thread.
简而言之,如果我在.cpp文件的开头添加以下片段:
#includevoid 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有关,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
一些观察:
如果我注释掉SP_join
A.cpp的那一行,问题就会消失.
如果我注释掉B.cpp的单行,问题就会消失.
如果我将B.cpp的单行移动或复制到A.cpp的开头或结尾,问题就会消失.
(在方案2和3中,程序在调用时崩溃SP_join
,但这仅仅是因为邮箱无效......这与手头的问题无关.)
另外,Spread的核心库是链接的,这肯定是我的问题#1的答案的一部分,因为我的系统中没有该lib的调试版本.
目前,我正试图想出一些可以在另一个环境中重现问题的东西.(即使我真的可以在我的场所外重复,我会感到非常惊讶......)
编辑2:好了,所以在这里我们现在有使用一个包,我能够重现上WinXP32的几乎香草安装问题+ VS2008 +升压1.36.0(仍然从BoostPro计算预建的二进制文件).
罪魁祸首肯定是Spread lib,我的构建在某种程度上需要一个相当古老的STLPort版本用于MSVC 6!尽管如此,我仍然觉得这些症状相对有趣.此外,如果你能真正重现这个问题 - 包括上面的方案1-3,那将是很好的.包装很小,应该包含所有必要的部分.
事实证明,问题与Boost.Thread没有任何关系,因为这个例子现在使用了Boost Filesystem库.此外,它现在抱怨MSVCR90.dll,而不是之前的P.