9

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

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

4

3 回答 3

3

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

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

于 2012-08-27T14:09:03.880 回答
1

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

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

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

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

如果您担心 DLL 加载和函数调用成本,您可以尝试使这些调用尽可能少(可能不仅将算法,而且将一些更高级的逻辑移动到 DLL 中)。也看到这个 issie

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

于 2012-08-27T14:39:34.670 回答
1

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

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

于 2012-08-27T15:19:37.460 回答