根据this question (Developing C wrapper API for Object-Oriented C++ code)给出的答案,我设法为我的C ++代码编写了一个C包装器。
我想将我的包装器编译并链接到一个静态库(使用g ++编译),该库可以仅使用gcc(而不是g ++)来使用,编译和链接。这样,库的用户就不必关心库是用C ++编写的。
这可能吗?
答案 0 :(得分:1)
是的,您只需要为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
答案 1 :(得分:1)
此链接解释了一些编译器选项和方案:http://docs.oracle.com/cd/E19422-01/819-3690/Building.Libs.html具体来说:
> 16.7 Building a Library That Has a C API
如果你想构建一个用C ++编写但可以的库 与C程序一起使用时,您必须创建一个C API(应用程序 编程接口)。为此,请创建所有导出的函数 外部“C”。请注意,这只能用于全局函数和 不适用于会员功能。
如果C接口库需要C ++运行时支持,那么你是 与cc链接,然后您还必须链接您的应用程序 使用时的libC(兼容模式)或libCrun(标准模式) C接口库。 (如果C接口库不需要C ++ 运行时支持,那么你不必与libC或libCrun链接。) 链接的步骤因归档和共享库而异。
提供存档的C接口库时,必须提供 有关如何使用该库的说明。
如果C接口库是在标准模式下使用CC构建的( 默认情况下),在使用C接口时将-lCrun添加到cc命令行 图书馆。如果C接口库是使用CC兼容性构建的 mode(-compat),使用时将-lC添加到cc命令行 C接口库。在提供共享C接口库时 必须在构建时创建对libC或libCrun的依赖 图书馆。当共享库具有正确的依赖关系时,您 使用时,不需要在命令行中添加-lC或-lCrun 库。
如果要在兼容模式下构建C接口库 (-compat),在构建库时将-lC添加到CC命令行。 如果要在标准模式下构建C接口库( 默认情况下),在构建时将-lCrun添加到CC命令行 图书馆。如果要删除对C ++运行时的任何依赖性 库,您应该在您的库中强制执行以下编码规则 图书馆来源:
除非您自己提供,否则请勿使用任何形式的新内容或删除内容 相应的版本。不要使用例外。不要使用运行时类型 信息(RTTI)。