围绕可以通过C链接器链接的C++库创建一个C包装器

Create a C wrapper around a C++ library that can be linked by a C linker

本文关键字:链接 包装 一个 C++ 可以通过 创建      更新时间:2023-10-16

根据这个问题的答案(为面向对象的C++代码开发C包装器API),我设法为我的C++代码编写了一个C包装器。

我想编译我的包装并将其链接到一个静态库(使用g++编译)中,该库可以仅使用gcc(而不是g++)使用、编译和链接。这样,库的用户就不必关心库是用C++编写的。

这有可能吗?

此链接解释了一些编译器选项和场景:http://docs.oracle.com/cd/E19422-01/819-3690/Building.Libs.html具体而言:

>16.7建立一个具有C API 的库

如果你想构建一个用C++编写的库与C程序一起使用时,必须创建一个C API(应用程序编程接口)。要执行此操作,请使所有导出的函数外部"C"。请注意,这只能用于全局函数和不适用于成员功能。

如果C接口库需要C++运行时支持,并且您链接到cc,则您还必须将您的应用程序链接到libC(兼容模式)或libCrun(标准模式)C接口库。(如果C接口库不需要C++运行时支持,则不必与libC或libCrun链接。)存档库和共享库的链接步骤不同。

当提供存档的C接口库时,必须提供关于如何使用图书馆的说明。

如果C接口库是用标准模式下的CC构建的(默认值),在使用C接口时将-lRun添加到cc命令行图书馆如果C接口库是与兼容的CC一起构建的mode(-compat),在使用C接口库。当提供共享的C接口库时必须在构建时创建对libC或libCrun的依赖项图书馆。当共享库具有正确的依赖关系时当您使用图书馆

如果您正在以兼容模式构建C接口库(-compat),在构建库时将-lC添加到CC命令行。如果您正在以标准模式构建C接口库(默认值),在构建图书馆如果要删除对C++运行时的任何依赖库中,您应该在图书馆来源:

除非您提供自己的,否则不要使用任何形式的新建或删除相应的版本。不要使用异常。不使用运行时类型信息(RTTI)。

是的,您只需要为C接口提供具有C链接的函数。正如链接问题的答案一样,尽管对于标题,您需要使其符合C。常见的方法是使用#ifdef __cplusplus来检测编译器是C编译器还是C++编译器。

// MyHeader
#ifndef MYHEADER
#define MYHEADER
#ifdef __cplusplus
// Class definition or any other C++ code
extern "C" {
#endif
// C only code here
#ifdef __cplusplus
}
#endif
#endif