2014-09-25 121 views
0

我用C++编写的应用程序是使用Visual Studio 2010构建的,它需要链接两个外部动态库。其中一个图书馆是用VS 2010构建的(这里没有问题),而另一个图书馆是用VS 2012构建的。该计划是否可行?这是否是常见的 - 将使用不同编译器版本构建的链接库导入到本身可能使用不同编译器构建的应用程序中。如果这样做不起作用,或者如果这种做法不受欢迎,我想了解在这种情况下防止互操作性的原因。VS 2012与VS 2010的互操作性

+0

可能是一个非常非常糟糕的主意。最糟糕的情况是它似乎正常工作。 – 2014-09-25 22:10:25

+2

C++ 11使得这个非常危险,比以前更多。所有标准C++库类的对象布局都已更改。在C++中没有互操作性,唯一可行的是具有完全相同编译选项的完全相同的编译器版本。 – 2014-09-25 22:22:08

回答

3

如果导出的函数使用一个“C”接口,所述参数/返回类型是一般的Windows API类型如LONGDWORDTSTRBOOL等或指针于这些类型的,那么不应该有使用由不同版本的Visual Studio创建的DLL的问题。

就我个人而言,我已经使用VS 2010构建了DLL,并将它与使用VS 6.0构建的应用程序一起使用。

但是,如果您的DLL的导出函数传递类型,如STL或MFC类型,或者诸如FILE之类的东西,那么您遇到了问题,因为这些类型在编译器版本中不同。你别无选择,只能确保你的应用程序和DLL的匹配VS版本。

+0

至少有一个附加要求:内存必须使用分配它的相同运行时释放。例如,如果您在VS2012库中调用malloc(),则不能从VS2010库的该内存块中调用free()。 (无论如何,这是最佳实践,但在这种情况下是一个常见问题。) – 2014-09-25 22:57:07