创建一个C包装器,将其放置在一个C++库周围,以便可以通过C链接器进行链接。

5

在参考这个问题(为面向对象的C++代码开发C封装器API)的回答后,我成功地为我的C++代码编写了一个C封装器。

我想将我的封装器编译和链接到一个静态库中(使用g++编译),并且该库可以使用gcc进行编译和链接(不需要使用g++)。这样,库的用户就不必关心库是用C++编写的。

这是否可行?


下面的链接对此进行了一些解释:http://docs.oracle.com/cd/E19422-01/819-3690/Building.Libs.html向下滚动到16.7,其中包含我认为适用于你的情况的编译器选项 - Neil Neyman
1
@NeilNeyman 这确实回答了我的问题。不幸的是,它确认了我的库的客户端应用程序需要与stdc++链接。但似乎这是唯一的方法。如果您将其作为答案,我会接受它。 - Mathieu Pagé
2个回答

2
此链接解释了一些编译器选项和场景:http://docs.oracle.com/cd/E19422-01/819-3690/Building.Libs.html,具体如下: > 16.7 构建具有C API的库 如果您想构建一个用C++编写但可以与C程序一起使用的库,则必须创建C API(应用程序编程接口)。为此,请将所有导出函数设置为extern "C"。请注意,这只能针对全局函数而不是成员函数进行操作。
如果C界面库需要C++运行时支持,并且您正在使用cc进行链接,则在使用C界面库时还必须将应用程序与libC(兼容模式)或libCrun(标准模式)链接。 (如果C界面库不需要C ++运行时支持,则无需链接libC或libCrun。)存档库和共享库的链接步骤有所不同。
提供归档的C界面库时,必须提供有关如何使用库的说明。
如果使用CC以标准模式(默认值)构建了C界面库,请在使用C界面库时将-lCrun添加到cc命令行中。如果使用CC以兼容模式(-compat)构建了C界面库,请在使用C界面库时将-lC添加到cc命令行中。提供共享的C界面库时,您必须在构建库时创建对libC或libCrun的依赖关系。当共享库具有正确的依赖关系时,您在使用库时不需要添加-lC或-lCrun到命令行。
如果要在兼容模式(-compat)下构建C界面库,请在构建库时将-lC添加到CC命令行中。如果要在标准模式(默认值)下构建C界面库,请在构建库时将-lCrun添加到CC命令行中。如果要删除对C ++运行时库的任何依赖关系,则应在库源中强制执行以下编码规则:
不要使用任何形式的new或delete,除非您提供自己相应的版本。 不要使用异常。 不要使用运行时类型信息(RTTI)。

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

这大概就是我所做的。然后使用g++和ar编译成wrapper.a。当我写一个C应用程序并尝试将其与wrapper.a链接时,会有一些未定义的引用(例如std :: string之类的东西)。如果我使用g ++(我想避免使用),它可以工作。 - Mathieu Pagé
@MathieuPagé:你需要链接所有所需的目标文件和可能的C++库,静态或动态都可以。 - David Rodríguez - dribeas
1
如果您想避免客户端应用程序提供std::string或类似内容,则链接C++库静态。 - Yakk - Adam Nevraumont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接