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

时间:2012-08-27 13:39:59

标签: c++ visual-studio-2010 visual-studio-2008 stl

我致力于优化算法,因此性能非常重要。与VS 2008相比,在VS 2010中编译时,该算法的速度提高了约8倍。谷歌搜索显示这不是我的错(参见例如https://stackoverflow.com/a/5560184/890355)。问题是最终项目必须在VS 2008下构建。

我倾向于在VS 2010中将我的算法构建为DLL,然后将其链接到主项目。是否可以在VS 2008下使用VC ++ 2010运行时库和我的DLL?如果是这样,那么最痛苦的方法是什么? 还有其他想法吗? 感谢。

3 个答案:

答案 0 :(得分:3)

运行时不是问题。没有什么能阻止您将DLL与VC2010运行时链接,然后在其他项目中使用该DLL。如果这些项目是使用Visual C ++ 2008或任何其他语言构建的,则无关紧要。

棘手的部分是设计DLL接口。简单地导出一些C ++类是有风险的,因为它会让您暴露出不同编译器之间的不兼容性。我认为最好的办法是公开C风格的界面或使用COM。我认为COM是最好的方法,但如果你不熟悉这项技术,那么C风格的界面就能正常运行。 (如果界面很简单,COM也可能过度杀死。)

答案 1 :(得分:1)

如果你要求使用任何其他方法将2008和2010库组合在一个可执行文件中,而不是将2010部件移到DLL中,那么答案可能是“没有其他简单的方法可以实现这一点”。

但是如果你不想“VC 2008 2010运行时库......在VS 2008下”(那就是在旧的2008 IDE中建立2010库),而是“在2008年使用2010编译的DLL-编译程序“,这是完全可能的。

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

静态链接和显式加载可以避免因运行时间不同而导致的许多不一致错误。

如果您担心DLL加载和函数调用成本,您可以尝试尽可能少地进行这些调用(可能不仅要将算法移动到DLL中,还要移动一些更高级别的逻辑)。另见this issie

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

答案 2 :(得分:1)

如果您小心,可以使用MS文档提供一些提示。我在此之前已经回答了这个问题:

Wondering if the lower version of visual studio can use the dll built using higher version of visual studio?