c++ - 是否可以在 C 程序中包含 C++ 库?

标签 c++ c gcc

我正在与一个承包商合作,他用 C++ 为我们开发了一个库。我想知道是否可以在 C 程序中使用该库。 我使用 Gcc 作为我的编译器。

最佳答案

是的,这是可能的。但是,正如 BoBTFish 在上面的评论中所说,您(或承包商)必须为 C++ 库设计一个 C 接口(interface):

  • 编写一个在 C 和 C++ 中编译的头文件,并声明一些 extern "C" 函数。这些函数的接口(interface)在 C 中必须有效,在 C++ 术语中这意味着它们仅使用 POD 类型(例如无引用)并且不会抛出异常。您可以将非 POD C++ 类声明为不完整类型并使用指向它们的指针,因此通常每个非静态成员函数都由一个函数包装,该函数将成为 this 的指针作为其第一个参数。
  • 用C++实现调用C++库的函数
  • 将库和包装器编译为 C++
  • 将您的程序编译为 C(您可以在需要的地方#include header)
  • 将它们与 g++ 链接在一起,以便 C++ 组件可以链接到 libstdc++。

我想您可能会争辩说,由于该程序与 g++ 链接,所以根据定义,它是一个使用 C 库(碰巧包含 main)的 C++ 程序,而不是而不是使用 C++ 库的 C 程序。就我个人而言,我不会费心争论这一点,重要的一点是您现有的 C 代码都没有改变。

例子:

库文件

#ifdef __cplusplus
extern "C"
#endif
int foo();

库文件

#include "lib.h"
#include <vector>
#include <iostream>

int foo() {
    try {
        std::vector<int> v;
        v.push_back(1);
        v.push_back(1);
        std::cout << "C++ seems to exist\n";
        return v.size();
    } catch (...) {
        return -1;
    }
}

主.c

#include "lib.h"
#include <stdio.h>

int main() {
    printf("%d\n", foo());
}

构建

g++ lib.cpp -c -olib.o
gcc main.c -c -omain.o
g++ main.o lib.o -omain

下面的代码也可以代替第三行,如果你想在使用 gcc 链接和使用 g++ 之间进行任意区分:

gcc main.o lib.o -llibstdc++ -omain

但是,我不确定 gcc -libstdc++ 是否可以像 g++ 一样工作,因为 >lib.cpp。这个例子我只是测试了一下,当然还有很多C++没用过。

关于c++ - 是否可以在 C 程序中包含 C++ 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20324863/

相关文章:

c++ - 值的 Ascii 名称

c++ - 如何在 C++/C 中处理 getopt 平台依赖

C:指针算术 - 它是如何工作的?

c - 我们如何使用 AleaGpu 将多维数组复制到内核?

c - c中前缀和后缀运算符的操作

c - 向 gcc 添加通行证?

c - SDL2 libSDL2_image.so : undefined reference to

c++ - 是否存在 static_warning?

c++ - 基于生产者-消费者的多线程图像处理

c++ - 以字符数组为参数的模板元编程