我有一個令人討厭的問題,我可能會以某種方式規避,但另一方面,將更重要的是它的頂部,並明白究竟是什麼繼續,因爲它看起來像這個東西真的留在這裏。添加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