gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:07:53 25 4
gpt4 key购买 nike

我正在与一个承包商合作,他用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com