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(). 如果您的插件和主机应用程序使用不同的 CRT,则主机对 free() 的调用将失败或崩溃,因为不是主机的 CRTmalloc()编辑了该内存块。

于 2011-01-19T15:49:54.950 回答
0

二进制文件不会相同,但二进制接口应该是相同的,这正是您所需要的。

你不能使用VS2010的原因是它还没有生产质量。他们认为您至少应该等待 VS2010 SP1。

你认为他们只是固执和固执,是吗?毁了你所有的乐趣。他们有理由。好的。

因为这样的错误:

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

于 2011-01-20T00:29:45.617 回答
0

我使用 Visual Studio 2008 和 2010 进行插件开发。我看到的唯一区别是用户需要 2010\2008 的 vs c++ 运行时版本。

但可能会有陷阱 - 但我还没有遇到任何问题。

于 2011-01-20T08:52:20.443 回答
0

C++ 没有标准化的二进制接口。编译器“修改”每个符号名称(即每个函数或静态数据)以包含有关命名空间和签名的信息,以便命名空间、参数重载等。能行得通。每个编译器都可以自由决定如何执行此操作。不同的 MSVS 编译器版本以不同的方式进行名称修改,因此通常您不能将使用 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 进行名称修改的方式来实现这一点。)

于 2011-10-06T18:20:47.950 回答