4

Windows/MSVC で使用する C++ ライブラリを作成しようとしています。

私の問題は、適切にリンクするために、さまざまなバージョンの MSVC の c++ ランタイム (シングルおよびマルチスレッド、デバッグおよびリリース、さまざまなコンパイラ バージョン、さまざまなその他のセキュリティおよびその他のオプション。

32 ビットと 64 ビットの 2 つだけを配布したいと考えています。

私の考えは、すべての STL 型に対して別の new 演算子 (mynew など) とカスタム アロケータを使用することです。ライブラリを作成するときは、/nodefaultlib. 次に、親プロジェクトからリンクするときに、mynew を new にサンクし、stl アロケータを標準 (または選択したもの) にサンクするように要求します。私は、削除と他のいくつかの機能を実行する必要があると思います。当然のことながら、ライブラリでのサンクの実装例を提供しますが、これにより、誰もが頭を悩ませることがなくなることを願っています。

これは可能ですか?誰もこれを試したことがありますか?Windows/MSVC でのライブラリの作成/配布のベスト プラクティスはありますか?

4

3 に答える 3

6

一般的な答えとして、静的リンクが必要です。

クリスの答えに関する簡単なメモ(ほとんどが良いのでブーストを下げたくありませんが...):

msvcrt.dll (バージョン管理されていないもの) にはリンクしないでください。これは OS 固有のバージョンの DLL であり、これにリンクすると、アプリはおそらく他のバージョンの Windows では動作しません。私の知る限り、常に msvcrt##.dll にリンクする必要があります。DDK にはそのためのライブラリが含まれている場合がありますが、何をしているのか本当にわからない限り、リンクしないでください。

于 2008-10-10T04:50:15.367 に答える
2

C++ ランタイム ライブラリに静的にリンクします。

  1. プロジェクトのプロパティを開きます。
  2. [構成プロパティ] | [構成プロパティ] に移動します。C/C++ | コード生成セクション。
  3. ランタイム ライブラリをマルチスレッド (/MT) に設定します。
于 2008-10-10T04:43:16.380 に答える
0

C++ を使用している場合は、カスタム アロケーターを使用する必要はなく、すべての割り当てをラップしますstd::tr1::shared_ptr(解放関数を指定できます)。これにより、クライアントが共有ポインターへの最後の参照を解放した場合でも、オブジェクトが解放されるときに呼び出されるのはライブラリ (またはライブラリの CRT) 内のコードであることを保証します。

これが「DLL境界地獄」を解決する1つの方法です。それが役に立てば幸い!:-)

編集:あなたの質問の意図を誤解していると思います。DLL 境界地獄を心配しているために CRT に依存したくないのではなく、どこにでもインストールできるバージョンの DLL が欲しかっただけだと思います。その場合、プログラムを にリンクさせることができますmsvcrt.dll。これは、どの Windows システムでも利用できます。

あなたは私から聞いたことがありませんが、どうやら Driver Development Kit には、新しいバージョンの Visual Studio を にリンクできるようにするある種のインポート ライブラリが含まれているようmsvcrtです。

于 2008-10-10T03:54:14.780 に答える