如何制作不需要用户使用特定版本的 Visual Studio 的 C++ API?

Posted

技术标签:

【中文标题】如何制作不需要用户使用特定版本的 Visual Studio 的 C++ API?【英文标题】:How to make a C++ API that does not require user to use a particular version of Visual Studio? 【发布时间】:2015-07-15 15:51:15 【问题描述】:

我创建了一个 C++ API,目前只能在特定版本的 Visual Studio (2008) 上运行。基本上,我有一个 C++ DLL(以及该 DLL 依赖的其他库),所有这些库都是用 Visual Studio 2008 编译的。这对我们的用户来说将是一个大问题,因为他们将运行更新版本的 Visual Studio。我需要想办法创建一个独立于平台的 C++ API。我听说这样做的一种方法是将所有接口方法包装在 C 中。这是解决这个问题的正确方法吗?我将如何将 C++ 代码包装在 C 中,这样用户就不会最终绑定到特定版本的 Visual Studio(并且也能够支持 Linux 环境)?

【问题讨论】:

简单的方法是为您支持的每个版本的 VS 提供库。 【参考方案1】:

由于 abi 可以在不同版本的 Visual Studio 之间更改,因此您需要扁平化您的类。正如你所说,你将你的类包装在一个 C 接口中,那么你将能够使用你想要的任何编译器。 为此,您可以使用 extern "C"。它将强制为您的方法使用 C 链接。

extern "C" 的简单示例

extern "C"

    void myExternCFunction(int* outParam);


//Later in the code
void myExternCFunction(int* outParam)

    *outParam = 42;

这是关于 extern "C" 的 *** 帖子 IsoCpp link 关于 extern "C"

如果你不知道 abi 是什么好东西,长话短说,它描述了如何将参数发送到方法,如何调用方法......

这是一个关于 abi 的article

【讨论】:

【参考方案2】:

DLL 本身应该只导出 C 风格的函数,而不是 C++ 类。然后任何编译器都可以使用 DLL。如果您还想提供 C++ API,请创建一个 .h 头文件来定义和实现您想要的 C++ 类,并让这些类在内部根据需要使用 DLL 函数。然后任何 C++ 编译器都可以使用 C++ API(只要你远离任何编译器特定的扩展,除非你 #ifdef 他们)。

【讨论】:

以上是关于如何制作不需要用户使用特定版本的 Visual Studio 的 C++ API?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用特定和 exaclty 包版本重新制作角度工作区?

如何在 Visual Studio 2015 中从 Git 获取特定版本?

制作Visual Studio 2017 (VS 2017) 离线安装包

vs201220132015 添加 ActiveX制作控件插件 Visual Studio Installer

程序集引用的“特定版本”属性在 Visual Studio 中究竟是如何工作的?

程序集引用的“特定版本”属性在 Visual Studio 中究竟是如何工作的?