围绕可以通过C链接器链接的C++库创建一个C包装器
Create a C wrapper around a C++ library that can be linked by a C linker
根据这个问题的答案(为面向对象的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
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 您如何将所有链接依赖项都包装到一个Linux静态库中
- 使用 SWIG 将 c++ 包装到 java 不满意的链接错误: HeaderJNI.new_Test()J.
- 包装函数只有在链接为静态时才从链接库调用
- 将SWIG包装器与其他库链接
- 围绕可以通过C链接器链接的C++库创建一个C包装器
- 代理包装类,运算符>链接
- 正在链接leveldb的包装类中的静态方法
- 懒惰的程序员将vbscript/hta文件包装在一个独立的静态链接的c++ exe中
- 在objc库中调用包装的静态c++库会导致链接器错误