2

異なるバージョンの MSVC でいくつかのプロジェクトで使用するサード パーティ製ライブラリをビルドする必要がある場合、通常はすべてのMSVC バージョンとデバッグ構成とリリース構成の両方に対してビルドします。それがブーストの役割であり、私たちのチームがこれまでずっとやってきたことです。

しかし、私はまだ理解していません.どうしてこのライブラリをビルドできなかったのですか...何でも. 必要なのは、関数プロトタイプとオブジェクト コードだけですよね? CRT を静的にリンクしているので、外部依存関係はありません。しかし、MSVC8 の Release でビルドされたライブラリを MSVC10 の Debug のプロジェクトにリンクしようとすると、この迷惑な「定義済み」リンカー エラーが発生します。

しかし、なぜ?このすべての関数を lib 内に「カプセル化」し、それらをエクスポートせずにプロジェクトが lib から必要なものだけを取得できるようにすることはできますか? すべてのプロジェクトでリンクできる libpng と zlib のプリコンパイル済みバージョンを使用できるのはなぜですか? はい、MSVC を使用してビルドされていないと思いますが、CRT の同じ機能を使用しています。誰かが詳細に説明したり、この問題の賢明な説明へのリンクを共有したりできますか?

4

1 に答える 1

3

CRT を静的にリンクしているので、外部依存関係はありません

そうではありません。あなたには依存関係があります。CRT の静的バージョン。ビルド設定に応じて、デバッグまたはリリースします。そして、それは外部依存関係であり、ライブラリがリンクされるときに、リンカーは後で CRT を接着します。ライブラリを使用するコードも、CRT に依存しています。コンパイル設定が一致しない場合は、リンカ barfs.

静的リンク ライブラリの代わりに DLL を構築することで、その依存関係を分離します。エクスポートされた関数が CRT の依存関係を引き起こさないことをさらに確認する必要があります。標準 C++ ライブラリから C++ オブジェクトを返すことはできず、クライアント コードによって解放される必要があるオブジェクトへのポインターを返すこともできません。パッキングは実装の詳細であるため、構造体を渡すことでさえ注意が必要ですが、通常はそれで問題ありません。実用的な良い例は COM オートメーションです。これは、ユニバーサルな型のサブセットを使用することを強制します。Windows にはそれらが蔓延しており、これらのサーバーはすべて、コンパイラまたは CRT の任意のバージョンで動作します。どんな言語でも。ただし、これには代償が伴います。そのようなライブラリを作成することは、静的ライブラリに大量のコードを投げ込むことほど簡単でも便利でもありません。

于 2012-03-15T15:51:39.363 に答える