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