在VC++2008项目中使用VC++2010运行库
Use VC++ 2010 runtime libraries in VC++ 2008 project
我研究优化算法,所以性能真的很重要。与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?
- 双线程应用比单线程应用慢 C++ (VC++ 2010 Express).如何解决?
- 从 Visual Studio 2010 运行 BOOST 单元测试
- 在VC 2010上使用SSL的libpq
- 区分 VC++ 2010 和更高版本的编译器版本
- VC++2010:显示打开的对话框挂起
- VC++ 2010:从 VC6++ 转换后显示打开对话框时出错
- 旧版 MFC 代码 (2005) 无法在 VC 2010 上编译
- 刷新MFC接口VC++2010
- 在VC++2008项目中使用VC++2010运行库
- C++程序是在VC++2010中编译的,而不是在Visual C++6.0中编译的
- VC++ 2010 "array is not a member of std"错误
- boost::bind 在 VC++ 2010 中绑定引发异常的函数时不起作用
- VC++2010搜索某个字符串的列表视图
- vc++2010/2012:std::包含unique_ptr编译器错误的结构的向量
- VC 2010可执行文件未在其他计算机上运行-无错误
- 这是VC++ 2010中的错误吗?
- 在 VC++ 2010 中使用个人静态库
- GetOverlappedResult()在运行时崩溃,但在vc++ 2010调试时不会崩溃
- 试图让我的游戏在VC 2010中运行,似乎无法链接SOIL库,不知道如何链接,包括游戏源代码
- 性能问题与c++(使用vc++ 2010):在运行时,我的程序似乎随机等待一段时间