5

按照这个问题的答案(Developing C wrapper API for Object-Oriented C++ code),我设法为我的 C++ 代码编写了一个 C 包装器。

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

这有可能吗?

4

2 回答 2

2

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

> 16.7 构建具有 C API 的库

如果要构建一个用 C++ 编写但可以与 C 程序一起使用的库,则必须创建一个 C API(应用程序编程接口)。为此,请将所有导出的函数设为外部“C”。请注意,这只能用于全局函数,不能用于成员函数。

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

提供存档的 C 接口库时,您必须提供有关如何使用该库的说明。

如果 C 接口库是在标准模式(默认)下使用 CC 构建的,则在使用 C 接口库时将 -lCrun 添加到 cc 命令行。如果 C 接口库是在兼容模式 (-compat) 下使用 CC 构建的,则在使用 C 接口库时将 -lC 添加到 cc 命令行。提供共享 C 接口库时,您必须在构建库时创建对 libC 或 libCrun 的依赖项。当共享库具有正确的依赖关系时,您在使用该库时无需在命令行中添加-lC 或-lCrun。

如果您在兼容模式 (-compat) 下构建 C 接口库,请在构建库时将 -lC 添加到 CC 命令行。如果您在标准模式(默认)下构建 C 接口库,请在构建库时将 -lCrun 添加到 CC 命令行。如果要删除对 C++ 运行时库的任何依赖,应在库源代码中强制执行以下编码规则:

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

于 2013-08-13T18:56:46.937 回答
1

是的,您只需要为 C 接口提供具有 C 链接的函数即可。与链接问题的答案完全相同,尽管对于标题,您需要使其符合 C 标准。常见的方法是使用 an#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
于 2013-08-12T20:25:18.553 回答