2009-07-26 7 views
5

OK .....私は、関連する質問やMSDNの記事を読んだことがあります。DLLとSTLと静的なデータ(oh my!)

この質問に対する答えは、現在の「最先端技術」は何

:私はVS 2008、C++アンマネージコードを使用してい

。私はかなりの数のDLLと非常に少数のEXEを含むソリューションファイルを持っています。私がビルド環境を完全に制御する限り、すべての部分とパーツは同じフラグで構築され、同じランタイムライブラリを使用し、静的にリンクされたCRTライブラリを持つ人はいません。STLオブジェクトを渡しても構いませんか?

これは問題ないと思われますが、読んでいる記事によっては、恐怖、不確実性、疑惑がたくさんあります。

舞台裏で静的なデータを生成するテンプレートにはあらゆる問題があることは知っています(すべてのDLLは自分のコピーを手に入れて心苦しくなるでしょう)。

+0

VS STLヘッダーファイルが書き込み可能モードになる方法に注意してください。 1つの偶発的なキーストロークがこのようなヘッダーファイルにあると、あなたのシステムは他のすべてとは異なります!私は懸念を共有しています... – xtofl

答えて

1

私たちは、数十のDLLで構成されたアプリケーションでSTLオブジェクトを正常に渡します。それを確実にするために、すべてのビルドで実行される自動テストの1つは、すべてのプロジェクトの設定を確認することです。新しいプロジェクトを追加して誤って設定したり、既存のプロジェクトの設定を破ったりすると、ビルドが失敗します。

私たちが確認する設定は次のとおりです。これらのすべてが問題を引き起こすわけではありませんが、一貫性を確認しています。

の#define

_WIN32_WINNT 
STRICT 
_WIN32_IE 
NDEBUG 
_DEBUG 
_SECURE_SCL 

コンパイラオプション

DebugInformationFormat 
WholeProgramOptimization 
RuntimeLibrary 
6

すべてが同じバージョンのランタイムDLLを使用している限り、STLに問題はありません。しかし、いったんあなたが周りに何かを持っていると、彼らは例えば、異なるヒープを使用する - トラブルの終わりにつながる。

+0

+1:エリックHが説明していることを正確に行い、それはすべて私のために働きます。 – RichieHindle

0

我々は我々のアプリケーションでSTLのコレクションを使用して(通常の参照など)異なるのDLLのメソッドにしてからそれらを渡します。これは何の問題も生じません。

問題が発生した領域は、1つのDLLがメモリを割り当て、別のDLLがその領域を削除しようとする領域だけです。これは悪いとしか報告されていませんが、私は理由は分かりません。しかし、それはデバッグビルド(報告されている)上の問題であるように見えますが、リリースビルドでも動作します。今まで私がどこに来たのかを言いながら、私はそれを修正する。

私がサードパーティ製のライブラリを作成していたのであれば、apiでstlパラメータを使用することについて2回考えていました。以前は(VC6)OCCI(Oracles C++ api)とは対照的にOCI(Oracles C API)を使用しなければなりませんでした。これはMicrosoft STL実装でのみ機能し、stlportを使用していたからです。もちろん、独自のstl実装でライブラリを構築するクライアントを有効にする場合、これは問題ではありません。