2

3ds Max SDK に記載されている要件では、3ds Max 2011 のプラグインは Visual C++ 9.0 (Visual Studio 2008) でビルドする必要があると記載されています。

異なるバージョンの Visual C++ で DLL を作成した場合、バイナリは同じではありませんか? これは、適切なコンパイラ設定を選択するだけの問題ですか?

Visual C++ 2010 (Visual Studio 2010) を使用してプラグインをビルドしようとすると、どのような問題が発生しますか?

4

4 に答える 4

1

特に 3ds Max についてはわかりませんが、通常の理由は C ランタイム ライブラリです。ホスト アプリケーションが CRT の DLL バージョンを使用する場合、プラグインも同じバージョンを使用する必要があります。

malloc()それ以外の場合は、プラグインが を使用してメモリを作成し、それをホスト アプリケーションに渡し、ホスト アプリケーションがそれを使用して を呼び出す場合を想像してくださいfree()malloc()プラグインとホスト アプリケーションが異なる CRT を使用している場合、そのメモリ ブロックを編集したのはホストの CRT ではないため、ホストの free() への呼び出しは失敗またはクラッシュします。

于 2011-01-19T15:49:54.950 に答える
0

プラグインの開発には、VisualStudio2008と2010の両方を使用しています。私が見た唯一の違いは、ユーザーが2010\2008のvsc++ランタイムバージョンを必要としていることです。

しかし、落とし穴があるかもしれませんが、私はまだ問題に遭遇していません。

于 2011-01-20T08:52:20.443 に答える
0

バイナリは同一ではありませんが、バイナリ インターフェイスは同一である必要があります。これが必要です。

VS2010 を使用できない理由は、まだ製品品質ではないためです。彼らは、少なくとも VS2010 SP1 を待つべきだと考えています。

頑固で頑固なだけだと思いますか?あなたのすべての楽しみを台無しにします。彼らには理由があります。良いもの。

このようなバグのため:

https://connect.microsoft.com/VisualStudio/feedback/details/565959

于 2011-01-20T00:29:45.617 に答える
0

C++ には、標準化されたバイナリ インターフェイスがありません。コンパイラは、各シンボル名 (つまり、各関数または静的データ) を "マングル" して、名前空間とシグネチャに関する情報を含めます。働ける。各コンパイラは、これを行う方法を自由に決定できます。MSVS コンパイラのバージョンが異なれば名前マングリングの方法も異なるため、一般に、2005 でコンパイルされた C++ ライブラリと 2008 でコンパイルされたライブラリをリンクすることはできません。これには、2005 の実行可能ファイルから 2008 の DLL をロードすることも含まれます (たとえば)。ライブラリ間のインターフェースが C の場合、関連する関数がextern "C"名前の改ざんを防ぐため。実際には、違いは必ずしもそれほど大きくはありません。たとえば、VS2005 SP1 を使用して 3ds Max 9 用のライブラリをコンパイルする際に問題が発生したことはありません。これには、サービス パックなしで VS2005 が必要であると思われます。

Microsoft はこの非互換性を修正しようとしているので、VS2010 でオプションを導入したため、VS2010 は VS2005 プログラムまたは VS2008 プログラムと互換性のあるバイナリを生成できます (以前のバージョンもあるかもしれませんが、忘れてしまいました)。複数の 3ds Max バージョンで動作するプラグインを作成する必要があり、VS2010 のバグに悩まされていない場合、これはおそらく良いオプションです。また、Intel C++ コンパイラには、選択した MSVS バージョンと互換性のあるバイナリを生成するモードがあります。これは、趣味で使用する場合や、少し高価な値札を買う余裕がある場合に適したオプションです。(彼らは、MSVS が名前マングリングを行う方法をコピーすることによってこれを実現します。)

于 2011-10-06T18:20:47.950 に答える