3

私はプレーンC++(.NETではなくMFCなし)で書かれたC++ライブラリを扱う予定です。このライブラリは、Visual Studio 2005/Intel Fortran 9.1とVS 2008/Intel Fortran 10.1の両方を使用してコンパイルできます。Visual Studio 2008でコンパイルしたC++ dllをVisual Studio 2005で使用できますか?

明らかに私はVS 2008のバイナリを私のコンピュータ上に置いていますので、私はそれを使っていますが、ストレートC++ライブラリがVS 2005と2008の間で互換性がない理由があるのか​​不思議です。名前の変更は同じであると仮定しますが、おそらく他にも理由があります。私は長い間C++を使用していないので、これらのことについては少し錆びています。

答えて

2

あなたが遭遇する最大の問題は、CRTの使用です。 CRT(C RunTime)がDLLに静的にリンクされている場合、問題はありません。

しかし、CRTがプロジェクトに動的にリンクされていると、問題が発生する可能性があります。 Visual Studio 2005と2008は異なるバージョンのCRTを使用しており、簡単に読み込むことはできません。しかし、DLLのどちらかまたは両方がCRTを静的にリンクしていれば、あなたはまともな姿勢でなければなりません。

+0

ありがとうございました。この記事では、http://msdn.microsoft.com/en-us/library/ms235460.aspxをリンクする際のいくつかの問題について詳しく説明しました。私が持っているライブラリは基本的にファイルI/Oライブラリなので、ダイナミックリンクはおそらくより良いアイデアです(使用方法によって異なります)。 –

+0

そして私はdumpbin/importsでそれを調べました。ライブラリはCRTに動的にリンクされています。 –

3

おそらく動作するはずです。 VS 2005でコンパイルされたDLLは、VS 2005のC標準ライブラリ(msvcr80.dll)の実装に依存しますが、コードはVS 2008のCライブラリ(msvcr90.dll)に依存します。これは、実行時に両方のバージョンのCライブラリがロードされることを意味しますが、これはメモリ使用量を増加させ、ロード時間を非常に短くします。

+0

これは、2つのCRTライブラリ間のCRTオブジェクト(メモリ、ファイルハンドル)を変更しようとしない場合にのみOKです。たとえば、* 80.dllにメモリを割り当て、* 90.dllで操作することはOKですが、解放するか、* 90.dllで再割り当てすることはできません。デバッグとリリースは同様に動作します。 –

3

他のポスターがコメントしたように、この方法で作業することができます。

しかし、大きな問題になる可能性のある1つの問題があります。メモリ管理。特に、C++のランタイムは扱いにくいことがあります。

最も大きな問題は、2005年と2008年のランタイムがメモリをどのように管理するかにいくつかの非互換性があることです。 VS2008 DLLに常にメモリを割り当て、DLL内で割り当てられたメモリをDLL内で常に削除すると、すべて正常に動作します。これは通常、あなたのDLLにいくつかの "余分な"ファクトリとクリーンアップメソッドを作成し、これらを公開する必要があります。

VS 2008 DLL内からメモリを割り当て、VS 2005を使用してコンパイルしたコードからメモリを削除したり、その逆の場合は、デバッグするのが非常に難しい問題が発生することがあります。それはしばしば動作しますが、ランダムなクラッシュまたは不安定性を持ちます。

関連する問題