在VC++ 2008项目中使用VC++ 2010运行库

9
我在优化算法方面工作,因此性能真的很重要。与VS 2008相比,在VS 2010中编译的算法速度快了约8倍。Google搜索显示这不是我的问题(例如,请参见https://dev59.com/rlXTa4cB1Zd3GeqP6O2Y#5560184)。问题在于最终项目必须在VS 2008下构建。
我倾向于的解决方案是在VS 2010中将我的算法构建为DLL,然后将其链接到主项目。是否可以在VS 2008下使用VC++ 2010运行时库来运行我的DLL?如果可以,最简单的方法是什么?还有其他想法吗?谢谢。

Visual Studio使用的C++编译器不支持C++0x,如果您在询问这个。当然,如果您想避免升级到Visual Studio 2010和/或Visual Studio 2012,您可以随时使用更高版本的编译器。一种可能的解决方案是使用不同的编译器编译优化算法,并引用所述编译器创建的输出。 - Security Hound
2
你的库之间是否传递对象,并期望彼此进行解除分配?混合使用库可能有效,但存在一些相当限制性的注意事项(并且使用C++容器可能会导致不良魔法):http://stackoverflow.com/questions/6531401/how-to-use-vs2010-built-dlls-in-vs2008 - 简而言之,如果您可以保持一致并仅使用一个C++运行时,则更容易。 - wkl
3
只有使用来自VS2010的#include文件,这才能得到良好的结果。但由于你需要移动语义的性能改进,所以VS2008无法编译它们。请注意不要改变原文意思。 - Hans Passant
3个回答

3
运行时不是问题。您可以将DLL链接到VC2010运行时,并在其他项目中使用该DLL。这些项目是使用Visual C++ 2008或任何其他语言构建的都没有关系。
麻烦的部分是设计DLL接口。简单地导出一些C++类是有风险的,因为它会暴露您与不同编译器之间的不兼容性。我认为最好的方法是要么公开一个C样式接口,要么使用COM。我认为COM是最好的方法,但如果您对该技术不熟悉,则使用C样式接口也可以。 (如果接口很简单,则COM也可能超级费力。)

1

如果你想要将2008和2010库合并到一个可执行文件中的其他方法,而不是将2010部分移动到DLL之外,那么答案可能是“没有其他简单的方法可以实现这一点”。

但是,如果您不想在旧的2008 IDE中构建针对2010库的“VC++ 2010运行时库...”,而是“在您的2008编译程序中使用2010编译的DLL”,那么完全有可能。

最简单的方法,就像我们在项目中所做的那样,是针对静态链接标准库(如果您使用MFC,则为MFC)构建(.exe和DLL),然后在您的.exe中使用LoadLibrary来加载DLL。在DLL中,您可以导出(_declspec(dllexport))一个函数(最好在extern "C" {}保护内),并通过GetProcAddress在.exe中使用它。

静态链接和显式加载可以避免由不同运行时引起的许多不一致性错误。

如果您担心DLL加载和函数调用的成本,可以尝试尽可能减少这些调用(也许通过将不仅算法,而且一些更高级别的逻辑移入DLL中)。请参见this issie

并且您可以使用native multitargeting在一个IDE(2010)中构建所有代码(但是您仍然需要针对v9和v10库分别构建主应用程序和DLL)。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接