質問

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

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

32ビットと64ビットの2つだけを配布したいです。

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

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

役に立ちましたか?

解決

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

Chrisの答えを簡単にメモします(ほとんどの場合良いので、ブーストを下げたくないのですが...):

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

他のヒント

C ++ランタイムライブラリへの静的リンク:

  1. プロジェクトのプロパティを開きます。
  2. 構成プロパティに移動| C / C ++ |コード生成セクション。
  3. ランタイムライブラリをマルチスレッド(/ MT)に設定します。

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top