2011-07-11 28 views
4

コンパイラの最適化を使用する他のプログラマ用の(静的な)ライブラリを作成したいと思います。C++ライブラリに使用する最適化設定

デバッグビルドを使用してライブラリを作成してテストしていますが、かなり遅く実行されていますが、リリースビルドに切り替えるとそれほど速くはないようです。

現時点では、ライブラリをデバッグビルドとしてコンパイルしましたが、別のプロジェクトで使用していますが、どのくらい時間がかかるのか気づきましたが、新しいプロジェクトをリリースビルドに切り替えると、リンクは、このようなエラーの多くで失敗します。

LIBCMTD.lib(tzset.obj):エラーLNK2005:すでにMSVCRT.LIB(MSVCR90.dll)で定義されて__tzset

は、私がどのような設定を使用する必要がありますプログラマーが独自のプロジェクトでライブラリを使用できるように自分のライブラリを構築するときに、デバッグやリリースビルドを使用するかどうかは問題ありません。

答えて

4

、MSDNでこの記事を見てください:それ以外の場合は、それはそれに対してリンクし実行可能ファイルの同じCRTを使用する必要がありますリンカーは同じCRTルーチンとデータ構造(公的なものと内部構造の両方)の競合するバージョンを見つけるでしょう。

現在4つのバージョンのCRT(すべてのデバッグ/リリースと静的/静的リンクの組み合わせ)が存在するため、ライブラリには4種類の異なる.libファイルを用意する必要があります。ちなみに、これはほとんどの人が静的ライブラリを.lib形式で配布しているのではなく、ライブラリユーザが好む方法でコンパイルされるソースを提供する理由の1つです。

これが気に入らない場合は、ライブラリをdllとして配布することを検討する必要があります。この最後のケースでは、CRTについて注意する必要があります。これは、DLLとそれを使用するプログラムが同じCRTを共有していない場合(そのうちの1つが静的リンクバージョンのCRTを使用するか、ダイナミックリンクCRTの)いくつかのC++機能を正しく動作させることはできません。最も顕著な問題は、delete他のモジュールによってnewで割り当てられたものができないことです.2つのCRTが2つの分離されたヒープを使用しているためです。

また、C++ライブラリで定義された型をモジュール間で渡すと、異なるCRTバージョン間でバイナリ互換性があることが保証されないため、おそらく問題が発生します。 CRTIと一致しない場合、RTTIと例外も問題のある領域です。

ロングストーリーショート:静的ライブラリでは、と一致する必要があります。そうしないと、さまざまなモジュールがリンクされません。 DLLを使用すると、CRTが正しく一致し、すべて正常に動作するはずです。それ以外の場合は、Cスタイルのインターフェイスを提供し、各モジュールにメモリ割り当てを管理させることが唯一の賢明な方法です(malloc/freeをエクスポートして他のモジュールがモジュールのヒープからメモリを割り当て/解放できるようにする)。

3

デバッグビルドとリリースビルドの両方を出荷する必要があります。 1つのライブラリを、デバッグモードとリリースモードの両方で使用するために出荷することはできません。

0

これは静的ライブラリの古い問題である

Power Your App with the Programming Model and Compiler Optimizations of Visual C++

+0

これはどのように関連していますか? –

+0

@Matteo Italia:いくつかのコード最適化手法を紹介しています。また、「最新の言語機能を備えたより高速なコード」(http://msdn.microsoft.com/hi-in/magazine/cc163971(en-us))へのリンクもあります。 aspx)そのうちのいくつかは、少なくとも私がそう思った、それに従うのに役立つだろう。 –

+1

タイトルが誤解を招く場合がありますが、ここでの実際の問題は、コードを高速に実行する方法ではなく、ライブラリを他のオブジェクトモジュールとリンクする際にリンクエラー(ここでOPが最適化を切り替えると表示される)を回避する方法です。 –

関連する問題