如何制作不需要用户使用特定版本的 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 2015 中从 Git 获取特定版本?
制作Visual Studio 2017 (VS 2017) 离线安装包
vs201220132015 添加 ActiveX制作控件插件 Visual Studio Installer