2012-03-15 12 views
2

MSVCの異なるバージョンでいくつかのプロジェクトで使用するサードパーティ製のライブラリを作成する必要があるときは、通常、の場合は両方とものデバッグとリリース構成にします。それがブーストの仕組みです。私たちが私の一生の間、私のチームでやったことです。私のプロジェクトでデバッグとリリースの設定で使用するサードパーティライブラリを正しくビルドする方法は?

しかし、私はまだ得られません、なぜ私はちょうどこのようなライブラリを構築できませんでした。私が必要とするのは、関数プロトタイプとオブジェクトコードだけです。私はCRTを静的にリンクしているので、外部依存関係はありません。しかし、MSVC8でリリースされたライブラリとMSVC10でのデバッグで私のプロジェクトをリンクしようとすると、私はこの迷惑な "既に定義された"リンカエラーを抱えています。

なぜですか?私はlib内のすべての関数を "カプセル化"してエクスポートすることはできないので、私のプロジェクトはlibから必要なものだけを取ることができますか?すべてのプロジェクトでリンクできるプリコンパイルされたlibpngとzlibのバージョンはなぜあるのですか?はい、彼らはMSVCを使用してビルドされていませんが、私は推測しますが、まだCRTの同じ機能を使用しています。誰でも深く説明したり、この問題の啓蒙された説明へのリンクを共有したりできますか?

答えて

3

私は静的CRTにリンクしていますので、私はまあ、それは本当ではない外部依存関係

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

静的リンクライブラリの代わりにDLLを作成することにより、その依存関係を分離します。エクスポートされた関数がCRTに依存しないことをさらに確認する必要があります。標準C++ライブラリからC++オブジェクトを返すことはできず、クライアントコードによって解放される必要があるオブジェクトへのポインタを返すことはできません。パッキングは実装の詳細なので構造を渡すことも難しいですが、通常はそれから離れます。実用的な例として、COMオートメーションがあります。これは、普遍的なタイプのサブセットを使用するように強制します。 Windowsはそれらに蔓延しており、これらのサーバーはすべてのバージョンのコンパイラまたはCRTで動作します。どんな言語でさえ。しかし、これはコストがかかります。そのようなライブラリを書くことは、静的なlibにたくさんのコードを投げ込むだけの単純で便利な方法ではありません。

+0

ニースの回答! "...リンカはライブラリがリンクされると、CRTを後で接着します..." - リンカが.libのCRT関数をリンクさせる方法がありますか?自分のコードをリンクすることができます。なぜCRTをリンクさせることができないのですか? – Mikhail

+1

それは静的な.libsの仕組みではありません。これは非常に単純なファイル形式で、.objファイルのコレクションです。 DLLを作成することによって、リンカーにCRTをリンクさせるようにします。 –

関連する問題