3ds Max SDK中列出的要求必须使用Visual C ++ 9.0(Visual Studio 2008)构建3ds Max 2011的插件。
如果我使用不同版本的Visual C ++创建DLL,那么二进制文件不一样吗?这只是选择正确的编译器设置的问题吗?
如果我尝试使用Visual C ++ 2010(Visual Studio 2010)构建插件,我会遇到什么问题?
答案 0 :(得分:1)
我不知道具体用于3ds Max,但通常的原因是C运行时库。如果主机应用程序使用CRT的DLL版本,则插件也需要使用相同的版本。
否则,假设您的插件使用malloc()
创建一些内存,并将其传递给使用它的主机应用程序,然后调用free()
。如果您的插件和主机应用程序使用不同的CRT,则主机对free()的调用将失败或崩溃,因为malloc()
内存块不是主机的CRT。
答案 1 :(得分:0)
二进制文件不一样,但二进制接口应该是,这就是你需要的。
您无法使用VS2010的原因是因为它还没有生产质量。他们认为你应该至少等待VS2010 SP1。
你认为他们只是顽固而固执,是吗?毁了你所有的乐趣。他们有理由。好的。
由于这样的错误:
https://connect.microsoft.com/VisualStudio/feedback/details/565959
答案 2 :(得分:0)
我同时使用visual studio 2008和2010进行插件开发。 我看到的唯一区别是用户需要2010 \ 2008的vs c ++运行时版本。
但可能存在陷阱 - 但我还没有遇到任何问题。
答案 3 :(得分:0)
C ++没有标准化的二进制接口。编译器“破坏”每个符号名称(即每个函数或静态数据)以包括关于命名空间和签名的信息,以便命名空间,参数重载和& c。能行得通。每个编译器都可以自由决定如何执行此操作。不同的MSVS编译器版本以不同的方式命名mangling,因此通常不能将用2005编译的C ++库和用2008编译的库链接在一起:这包括从2005可执行文件加载2008 DLL(例如)。如果库之间的接口是C,则可以执行此操作,只要相关功能标有extern "C"
以防止名称损坏。在实践中,差异并不总是那么大:例如,我从来没有遇到过使用VS2005 SP1为3ds Max 9编译库的问题,据说这需要VS2005没有服务包。
微软正试图修复这种不兼容性,因此在VS2010中他们引入了一个选项,因此VS2010可以生成与VS2005程序或VS2008程序兼容的二进制文件(也许是某些早期版本,我忘了)。如果你必须创建一个插件来处理多个3ds Max版本,并且你没有被任何VS2010错误所困扰,这可能是一个不错的选择。此外,英特尔C ++编译器有一种模式,它可以生成与您选择的MSVS版本兼容的二进制文件,如果它适合您的爱好使用,或者您可以承受稍微昂贵的价格标签,这对您来说可能是更好的选择。 (他们通过复制MSVS命名的方式来实现这一点。)