我有一个令人讨厌的问题,我可能会以某种方式规避,但另一方面,将更重要的是它的顶部,并明白究竟是什么继续,因为它看起来像这个东西真的留在这里。添加Boost使调试版本依赖于“非D”MSVC运行时DLL
下面是故事:我有一个简单的OpenGL应用程序,它工作正常:在编译,链接或运行它时从未遇到过大问题。现在我决定尝试将一些更密集的计算转移到工作线程中,以便可能使GUI更加响应 - 当然使用Boost.Thread。
总之,如果我在.cpp文件的开头添加下面的代码片段:
#include <boost/thread/thread.hpp>
void dummyThreadFun() { while (1); }
boost::thread p(dummyThreadFun);
,然后我开始变得“这个应用程序未能启动,因为MSVCP90.dll未找到”的时候试图启动Debug版本。 (发布模式工作正常。)
现在看着使用Dependency Walker的可执行文件,谁也没有找到这个DLL(这是我预期的),我可以看到我们正在寻找它以便能够调用以下功能:
[email protected][email protected]@[email protected]@SAKXZ
[email protected][email protected][email protected]@@SA_JXZ
[email protected][email protected]@[email protected]@SAKXZ
[email protected][email protected][email protected]@@SA_JXZ
接下来,我想每一个实例转换的min
和max
使用宏来代替,但可能找不到给他们的所有引用,因为这并没有帮助。 (我正在使用一些外部库,但是我没有可用的源代码,但即使我能做到这一点 - 我不认为这是真的。)
所以,我的问题 - 我猜 - 是:
- 为什么我们寻找一个非调试DLL,即使使用调试版本?
- 解决此问题的正确方法是什么?甚至是一个快速和肮脏的?
我曾在Visual Studio 2008的一个非常香草的安装中首次尝试安装此功能包和SP1,但它们都没有帮助。当然也试图重建好几次。
我为Boost(v1.36.0)使用预先构建的二进制文件。这不是我第一次在这个项目中使用Boost,但这可能是我第一次使用基于单独源的部分。
禁用增量链接无济于事。该程序是OpenGL的事实似乎也不相关 - 当我在一个简单的控制台程序中添加相同的三行代码时,我遇到了类似的问题(但那里是抱怨MSVCR90.dll和_mkdir
,当我用boost::create_directory
替换后者,问题就消失了!!)。这实际上只是删除或添加这三行,这使得程序运行正常,或者根本不运行。
我不能说我理解并排(甚至不知道这是否相关,但这是我现在假设的),并且说实话,我也没有超级感兴趣 - 只要因为我可以构建,调试和部署我的应用程序......
编辑1:在试图建立一个精简的例子,反正重现问题,我发现这个问题与the 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>
一些观察:
- 如果我注释掉线A.cpp的
SP_join
,问题消失远。 - 如果我注释掉B.cpp的单行,问题就会消失。
- 如果我将B.cpp的单行移动或复制到A.cpp的开头或结尾,问题就会消失。
(在方案2和3,程序崩溃调用SP_join
时,但这只是因为邮箱是无效...这无关手头的问题。)
另外,Spread的核心库被链接进来,这肯定是我的问题#1的答案的一部分,因为在我的系统中没有该库的调试版本。
目前,我试图想出一些能够在另一个环境中重现问题的东西。 (虽然我会非常惊讶,如果它实际上可以重复我的处所外...)
编辑2:好了,所以here我们现在有利用这点我是能够重现一个包问题几乎香草安装的WinXP32 + VS2008 +升压1.36.0(仍然pre-built binaries from BoostPro Computing)。
罪魁祸首肯定是Spread lib,我的内部版本不知何故需要一个相当古老的STLPort版本,用于MSVC 6!尽管如此,我仍然觉得这些症状比较有趣。另外,如果你真的能够重现这个问题 - 包括上面的情况1-3,这将非常令人高兴。包很小,它应该包含所有必要的部分。
事实证明,这个问题并没有真正与Boost.Thread有关,因为这个例子现在使用了Boost Filesystem库。此外,它现在抱怨MSVCR90.dll,而不是像以前那样。
我确实有_DEBUG定义...预构建的二进制文件来自BoostPro Computing(http://www.boostpro.com/products/free),我让自动链接机制完成它的工作。 – Reunanen 2008-10-22 14:26:16
这是最离奇的。我现在很难过。你可以在一个完整的程序中重现问题,你可以发布? – 2008-10-22 14:37:01
现在很难说,但我必须考虑这种可能性。 – Reunanen 2008-10-22 16:00:22