开发者

Why do 3ds Max plug-ins need to be built with a specific version of Visual C++?

开发者 https://www.devze.com 2023-02-05 18:38 出处:网络
The requirements listed in the 3ds Max SDK state that pl开发者_运维知识库ug-ins for 3ds Max 2011 must be built with Visual C++ 9.0 (Visual Studio 2008).

The requirements listed in the 3ds Max SDK state that pl开发者_运维知识库ug-ins for 3ds Max 2011 must be built with Visual C++ 9.0 (Visual Studio 2008).

If I create a DLL with a different version of Visual C++, won't the binary be identical? Is this simply a matter of choosing the right compiler settings?

What problems will I run into if I try to build a plug-in using Visual C++ 2010 (Visual Studio 2010)?


I don't know specifically for 3ds Max, but the usual reason is the C Runtime library. If the host application uses the DLL version of the CRT, then plugins will also need to use the same version.

Otherwise, imagine the case where your plugin creates some memory using malloc(), and passes it to the host application, which uses it and then calls free(). If your plugin and the host application are using different CRTs, the host's call to free() will fail or crash because it wasn't the host's CRT that malloc()ed that block of memory.


The binary won't be identical but the binary interfaces should be, which is what you need.

The reason you can't use VS2010 is because it is not yet production quality. They think you should wait for VS2010 SP1 at a minimum.

You think they are just being obstinate and stubborn, eh? Ruining all your fun. They have reasons. Good ones.

Because of bugs like this:

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


I use both visual studio 2008 and 2010 for plugin development. Only difference I've seen is that the user need the vs c++ runtime version for 2010\2008.

But there might be pitfalls - but I have not encountered any problems with it yet.


C++ doesn't have a standardised binary interface. The compiler "mangles" each symbol name (i.e. each function or static data) to include information about namespaces and signature, so that namespaces, argument overloading, &c. can work. Each compiler is free to decide how to do this. Different MSVS compiler versions do name mangling in different ways, so in general you can't link a C++ library compiled with 2005 and a library compiled with 2008 together: this includes loading a 2008 DLL from a 2005 executable (for example). You can do this if the interface between the libraries is C, as long as the relevant functions are marked with extern "C" to prevent name mangling. And in practice the differences are not always that great: for example, I never had trouble using VS2005 SP1 to compile a library for 3ds Max 9, which supposedly requires VS2005 with no service pack.

Microsoft is trying to fix this incompatibility, so in VS2010 they introduced an option, so VS2010 can produce binaries compatible with VS2005 programs or VS2008 programs (maybe some earlier versions too, I forget). If you have to create a plugin to work with multiple 3ds Max versions, and you don't get caught out by any VS2010 bugs, this is probably a good option. Also, the Intel C++ compiler has a mode where it produces binaries that are compatible with an MSVS version of your choice, which might be a better option for you if it's for hobby use or you can afford the slightly expensive price tag. (They achieve this by copying the way MSVS does name mangling.)

0

精彩评论

暂无评论...
验证码 换一张
取 消