2012-01-16 8 views
5

私の会社では、最近VC9からVC10に切り替えました。ミキシングランタイムは実行可能なソリューションですか?

私たちはプロジェクトを移行しましたが、しばらくの間、本番マシンでVC9でコンパイルされたいくつかの基本的な共通DLLを保持しなければならないと担当者から教えられました。

これらのDLLはカスタム構造を使用しており、その中にはstd::vector,std::mapなどが含まれています。さて、私は標準的な容器のサイズが変わったことに注目しました。あるものは大きくなり、他のものは小さくなりました。その結果、カスタム構造のサイズも変更されました。

サイズ変更による問題を解決するために、私の同僚は人工的にサイズを増やして将来のメンバのサイズ変更を補うことができるようにしました。関数呼び出しでのスタックの破損を防止します。

個人的には、この「解決策」は恐ろしいことですが、大きさは重要ですが、構造のレイアウトも重要です。私にとっては、組織の問題を解決するために、すべての構造のメモリ占有量を増やすことは本当に間違っています。

短くするには、関数プロトタイプで非C型を使用しているときに、2つの異なるランタイム(説明されたトリックまたは他のトリックを使用)を同時に使用することも可能ですか?同様の状況に関して、良い/悪い経験をお持ちですか?

答えて

9

STLは、異なるメジャーバージョン間のバイナリ互換性を保証しませんでした。したがって、インターフェイスにSTLクラスを持つDLLを持っている場合は、DLLとDLL自体のクライアントに対して、同じコンパイラと同じ風味のCRTを使用する必要があります。

あなたはDLLの安全異なるコンパイラのバージョンで使用することができる、あなたはいくつかのオプションを持って構築したい場合は、のような:

  1. 純粋なCインターフェース(DLLがC++で記述することができが、公開が、インターフェイスは純粋なCでなければならず、C++例外はDLLの境界を越えることはできません)。
  2. このarticleで説明したように、DLLインターフェイスで抽象的なインターフェイスを公開します。
  3. を使用してください。
+0

'1'はオプションではありませんが、' 2'は実際にうまくいく可能性があります。リンクされた記事をありがとうございました。 – ereOn

+0

@ereOn:どうぞよろしくお願いいたします。 –

1

これらの古いライブラリを使用する必要があるものが、それらのライブラリにリンクされていて、それらのライブラリのバージョンに付属しているヘッダーファイルに対してコンパイルされていることを確認する必要があります。 C++には、どのようなデータ構造を扱うかを知るためにヘッダーファイルを見ることができなければならないので、他の方法はありません。

VC9ランタイムに対してコンパイルされてリンクされているいくつかのライブラリとリンクするという印象を受けます。この場合、残りのコードをVC10、ライブラリがVC9ライブラリのいずれのタイプもインタフェースに公開しない限り、私は「うまくいくかもしれない」と言っていますが、これは落とし穴やトラップで囲まれたエリアであり、一般的に可能なときはいつでも同じランタイムを使用する必要があります。あなたが必要とする最後のことは、あなたが話しているstd :: vectorのバージョン(とコンパイラとリンカがそれを理解するように説得することができても、プログラマも混乱してしまうことを保証できる) 。

これは難しいですが、ターゲットマシンで必要とされない時間まで、古いランタイムに固執するのは簡単です。

+0

ありがとうございます。私たちは既にすべてのコードベースをVC10に移行しましたが、状況はまるで厄介ではないように、ソースバージョンコントロール(VSS)は不可能ではありませんが、これらの変更をロールバックすることを非常に困難にします。もうオプションではありません:( – ereOn

+0

これは実際にはバージョン管理システムの期待された機能ではありません。私はあなたのために私たちのバージョン管理ソリューションはさらに悪くなると思います。逆行、分岐 –

+1

「enterprisey」とは、「機能が古い」という意味ですが、VSSは本当にひどいです。私は共感しています。あなたが不快な状況にあるように聞こえます。 –

1

私はこれを実際にやったことがあります。同様の方法で構造体をパディングします。はい、あなたは2つの異なるランタイムを使用することができますし、ABIが同じであれば正常に機能するはずです:ここでは、構造がサイズの変更を開始するときに壁に当たって、(ABIがどこにあっても) DLLの境界は実際には本当に面倒です。特に、VC10はC++ 11を予期してかなりの変更を加えています。 DLLのどこにC言語を使用しているのですが、バイナリ互換性の点で私には保証されています。

私は物事が実際にそれを食べる特定のケースを提供するのは難しいですが、私はあなたにこのようにあなたにそれを置くことができます:それはあなたが得ることを期待していないバグです、そしてこれは本当のホーネッツの巣です。

関連する問題