1

私を混乱させる2つの質問があります:

  1. MicrosoftのWebサイトから、同じプロジェクトで異なるCランタイムを使用することはできないと読みました。/ MTフラグでコンパイルされたdllがあるとすると、/MDコンパイルされたプロジェクトでdllを使用できません。私の質問は、LoadLibrary()を使用してdllをロードする場合、同じCランタイムを使用する必要があるということです。そうしないと、潜在的な危険は何ですか?

  2. / MTフラグを使用すると、ランタイムはバイナリファイルに静的にリンクされていると思います。しかし、私のdllプロジェクトの1つとして、/MTを使用してdllを作成しました。ただし、dumpbin.exe /dependents mydllを実行すると、MSVCR100.dllが依存関係にあることが示されます。私の質問は、なぜdllがまだMSVCR100.dllに依存しているのかということです。

4

2 に答える 2

2

1) いいえ、必須ではありません。これはどのプログラムでも発生します。たとえば、Windows DLL は独自の CRT を使用します。ただし、1 つのプログラムに CRT を混在させることは非常に危険であり、問​​題の診断が非常に困難になる可能性があります。Windows API は、これらの問題を回避するために慎重に設計されています。DLL に割り当てられたメモリを解放するコードを必要とせず、例外を使用せず、標準の C++ ライブラリ クラスを使用せず、ロケールやその他の種類に依存しません。共有 CRT 状態の。ミックスするとうまくいかないようなもの。C または COM API に制限すると、これらのトラップを回避するのに大いに役立ちます。

2) これは、/MD でコンパイルされたコードをリンクすると発生します。リンクする .libs と共通。

プロジェクトに DLL がある場合は常に /MD を使用し、すべてのコードをまったく同じコンパイラとオプションでコンパイルすることで、問題を回避できます。自分で構築していない静的ライブラリは非常に面倒なので、避けてください。

于 2012-08-08T09:43:50.290 に答える
1

あなたの2.質問に関して、依存関係は間接的です。DLL は、MSVCR100.dll に依存する DLL を使用しています。Dependency walkerを使用すると、コンポーネントの依存関係ツリーを表示し、どのライブラリが直接的および間接的に依存しているかを確認できます。

于 2012-08-08T08:50:18.317 に答える