【问题标题】:Create a C wrapper around a C++ library that can be linked by a C linker围绕可以由 C 链接器链接的 C++ 库创建 C 包装器
【发布时间】:2013-08-14 07:01:01
【问题描述】:

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

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

这可能吗?

【问题讨论】:

  • 以下链接解释了一点:docs.oracle.com/cd/E19422-01/819-3690/Building.Libs.html 向下滚动到 16.7 以获取我认为适用于您的情况的编译器选项
  • @NeilNeyman 这确实回答了我的问题。不幸的是,它确认我的库的客户端应用程序需要与 stdc++ 链接。但似乎这是唯一的出路。如果您将此作为答案,我会接受。
  • @NeilNeyman 完成!再次感谢。

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


【解决方案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++(我想避免),它可以工作。
  • @MathieuPagé:嗯,你必须链接所有你需要的目标文件,可能还有 C++ 库,无论是静态的还是动态的
  • 静态链接C++库,如果你想避免让客户端应用程序必须提供std::string或类似的东西
【解决方案2】:

这个链接解释了一些编译器选项和场景: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 接口时在 cc 命令行中添加 -lCrun 图书馆。如果 C 接口库是与 CC 兼容构建的 模式(-compat),使用时在 cc 命令行中添加 -lC C 接口库。在提供共享 C 接口库时,您 必须在构建时创建对 libC 或 libCrun 的依赖项 图书馆。当共享库具有正确的依赖关系时,您 使用时不需要在命令行中添加 -lC 或 -lCrun 图书馆。

如果您在兼容模式下构建 C 接口库 (-compat),在构建库时将 -lC 添加到 CC 命令行。 如果您在标准模式下构建 C 接口库( 默认),在构建时将 -lCrun 添加到 CC 命令行 图书馆。如果要删除对 C++ 运行时的任何依赖 库,您应该在您的 图书馆来源:

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

【讨论】:

    猜你喜欢
    • 2019-02-19
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多