何とか回避できるかもしれない厄介な問題がありますが、一方で、このようなものは本当にここにとどまっているように見えるので、むしろそれを乗り越えて何が起こっているのかを正確に理解したいと思っています.
ストーリーは次のとおりです。私は正常に動作する単純な 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 をインストールしようとしましたが、どちらも役に立ちませんでした。もちろんリビルドも何度か試みました。
Boost (v1.36.0) 用にビルド済みのバイナリを使用しています。このプロジェクトで Boost を使用するのはこれが初めてではありませんが、別のソースに基づくパーツを使用するのは初めてかもしれません。
インクリメンタル リンクを無効にしても役に立ちません。プログラムが OpenGL であるという事実も関連していないようです — 同じ 3 行のコードを単純なコンソール プログラムに追加すると、同様の問題が発生しました (ただし、MSVCR90.dll と について不平を言ってい_mkdir
ました。後者のboost::create_directory
場合、問題は解決しました!!)。この 3 行を削除または追加するだけで、プログラムが正常に実行されるか、まったく実行されなくなります。
私は Side-by-Side を理解しているとは言えません (これが関連しているかどうかさえわかりませんが、今のところはそれが私が想定していることです)。アプリをビルド、デバッグ、デプロイ...
編集 1:とにかく問題を再現する簡素化された例を作成しようとしているときに、問題がSpread Toolkitに関係していることを発見しました。(ただし、Boost のリンクを開始する前は、これはありませんでした。)
問題を再現できる最小限のプログラムを思いつきました。これは、A.cpp と B.cpp の 2 つのコンパイル ユニットで構成されます。
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 の 1 行をコメント アウトすると、問題は解決します。
- B.cpp の 1 行を A.cpp の最初または最後に移動またはコピーすると、問題は解決します。
(シナリオ 2 と 3 では、 を呼び出すとプログラムSP_join
がクラッシュしますが、これは単にメールボックスが有効でないためです...これは当面の問題とは関係ありません。)
さらに、Spread のコア ライブラリがリンクされています。私のシステムにはそのライブラリのデバッグ ビルドがないため、これは私の質問 #1 に対する答えの一部であることは間違いありません。
現在、別の環境で問題を再現できるようにする方法を考え出そうとしています。(実際に敷地外で再現できたらビックリしますが…)
編集 2:わかりました。これで、WinXP32 + VS2008 + Boost 1.36.0 のほぼバニラのインストールで問題を再現できるパッケージができました (まだBoostPro Computing からビルド済みのバイナリです)。
犯人は確かにSpread libであり、私のビルドにはMSVC 6用のかなり古いバージョンのSTLPortが必要です! それにもかかわらず、私はまだ症状が比較的面白いと感じています. また、上記のシナリオ 1 ~ 3 を含め、実際に問題を再現できるかどうかをお知らせいただければ幸いです。パッケージは非常に小さく、必要なすべての部品が含まれている必要があります。
結局のところ、この例では Boost Filesystem ライブラリを使用しているため、Boost.Thread とは特に関係がありませんでした。さらに、以前のように P ではなく、MSVCR90.dll について不平を言うようになりました。