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

时间:2013-08-12 20:16:24

标签: c++ gcc g++ static-libraries

根据this question (Developing C wrapper API for Object-Oriented C++ code)给出的答案,我设法为我的C ++代码编写了一个C包装器。

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

这可能吗?

2 个答案:

答案 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)。