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

Use VC++ 2010 runtime libraries in VC++ 2008 project

本文关键字:VC++2010 运行 VC++2008 项目      更新时间:2023-10-16

我研究优化算法,所以性能真的很重要。与VS2008相比,在VS2010中编译该算法的速度大约快8倍。谷歌搜索表明这不是我的错(例如。https://stackoverflow.com/a/5560184/890355)。问题是,最终项目必须在VS 2008下建造。

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

运行时不是问题。没有什么可以阻止您将DLL链接到VC2010运行时,然后在其他项目中使用该DLL。不管这些项目是使用Visual C++2008还是任何其他语言构建的。

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

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

但是,如果你不想"VC++2010运行时库…在VS 2008下"(这是针对旧的2008 IDE中的2010库构建的),而是"在2008编译的程序中使用2010编译的DLL",这是完全可能的。

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

静态链接和显式加载使您免受不同运行时导致的许多不一致性错误的影响。

如果你担心DLL加载和函数调用成本,你可以尽量减少这些调用(可能不仅要将算法,还要将一些更高级的逻辑移到DLL中)。也看看这个issie。

您可以使用本机多目标处理在一个IDE(2010)中构建所有代码(但是您仍然需要分别针对v9和v10库单独构建主应用程序和DLL)。

如果你小心的话,你可以,MS文档提供了一些提示。我之前在这里回答过这个问题:

想知道visual studio的较低版本是否可以使用使用visual studio的较高版本构建的dll?