2011-01-19 40 views
2

3ds Max SDK中列出的要求規定,3ds Max 2011的插件必須使用Visual C++ 9.0(Visual Studio 2008)構建。爲什麼3ds Max插件需要使用特定版本的Visual C++構建?

如果我使用不同版本的Visual C++創建DLL,那麼這個二進制文件是不是相同?這只是選擇正確的編譯器設置的問題嗎?

如果我嘗試使用Visual C++ 2010(Visual Studio 2010)創建插件,會遇到什麼問題?

+0

您應該在3ds Max客戶服務中提問。 – 2011-01-19 15:46:13

+0

客戶服務是什麼意思? Autodesk網站上的SDK討論論壇有一個解決我的問題的線索,但它沒有給出很好的答案。一些海報稱,VS2010運行良好,但Autodesk員工發佈的一條消息簡單地說「VS 2010不支持max 2011的插件」。我想這意味着「使用後果自負。」 – 2011-01-19 20:12:19

回答

1

我不知道專門用於3ds Max,但通常的原因是C運行時庫。如果主機應用程序使用CRT的DLL版本,則插件也將需要使用相同的版本。

否則,想象一下你的插件使用malloc()創建一些內存的情況,並將它傳遞給主機應用程序,主機應用程序使用它,然後調用free()。如果您的插件和主機應用程序正在使用不同的CRT,則主機對free()的調用將失敗或崩潰,因爲它不是主機的CRT,即malloc()編輯該內存塊。

0

二進制文件不會相同,但二進制接口應該是,這是你需要的。

你不能使用VS2010的原因是因爲它還沒有生產質量。他們認爲你應該至少等待VS2010 SP1。

你以爲他們只是固執而固執的,呃?毀了你所有的樂趣。他們有理由。好的。

因爲像這樣的bug:

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

0

我同時使用Visual Studio 2008和2010的插件開發。 我所看到的唯一區別是用戶需要2010 \ 2008版的vs C++運行時版本。

但是可能存在缺陷 - 但我還沒有遇到任何問題。

0

C++沒有標準化的二進制接口。編譯器將每個符號名稱(即每個函數或靜態數據)「包含」,以包含關於名稱空間和簽名的信息,以便命名空間,參數重載,& c。能行得通。每個編譯器都可以自由決定如何執行此操作。不同的MSVS編譯器版本的命名方式不同,因此通常不能將用2005編譯的C++庫和用2008編譯的庫鏈接在一起:這包括從2005可執行文件(例如)加載2008 DLL。如果庫之間的接口爲C,則只要相關函數標記爲extern "C"以防止名稱變形,就可以執行此操作。實際上,差異並不總是那麼好:例如,我從來沒有遇到使用VS2005 SP1編譯3ds Max 9庫的麻煩,因爲這需要VS2005沒有Service Pack。

微軟正試圖解決這種不兼容問題,所以在VS2010中他們引入了一個選項,因此VS2010可以生成與VS2005程序或VS2008程序兼容的二進制文件(也許一些早期版本,我忘記了)。如果您必須創建一個插件來使用多個3ds Max版本,並且您不會被任何VS2010錯誤所困擾,那麼這可能是一個不錯的選擇。此外,英特爾C++編譯器提供了一種模式,可以生成與您選擇的MSVS版本兼容的二進制文件,如果是愛好使用,或者您可以承擔稍微昂貴的價格標籤,這對您來說可能是更好的選擇。 (他們通過複製MSVS的命名方式來實現這一點。)

相關問題