在C项目中使用C++代码

gra*_*uet 8 c linux

我有一个客户端提供了一个C++代码,我非常需要在用C编写的一个非常大的项目中使用它.

问题是:我无法重写C++代码在C ...太容易了,我没有这个代码的IP,客户端必须维护代码.

我也无法使用g ++在C中链接我真正的大项目:这会破坏事情!

我试图将C++代码转换为lib,导出C-Style接口(使用extern"C",将类封装到结构中)但是在将此lib链接到我的项目时遇到问题...(记住,不能使用g ++链接):我最终得到几乎所有STL的未定义引用在绝望中,我将STL静态链接到我制作的C/C++包装器lib但是这并没有改变任何东西.

我对C++知之甚少,但我不想为这个特定的用例编写C++ STL/C包装器.

现在,我从C++代码中创建了一个二进制文件,我在我的C代码中使用fork/exec调用它...这是一个我想避免的非常糟糕的解决方案.

如果有人有线索/方向/提示,那将非常感激.

Thx,Guillaume.

Bas*_*tch 1

您可以使用 链接共享 C++ 库,g++并将其与您的程序链接gcc,如下所示:

 g++ -Wall -O -c -fPIC lib++/src1.cc -o lib++/src1.pic.o
 g++ -Wall -O -c -fPIC lib++/src2.cc -o lib++/src2.pic.o
 ## etc, compile each C++ file of the library
 ##
 ## then link the library with standard C++ library, etc...
 g++ -shared lib++/src*.pic.o -lstdc++ -o lib++/libpp.so
Run Code Online (Sandbox Code Playgroud)

然后在您的 C 项目中使用该共享库:

 gcc -Wall -O -c src/file1.c -o src/file1.o
 gcc -Wall -O -c src/file2.c -o src/file2.o
 ## link your program with lib++/libpp.so
 gcc src/fil*.o -L lib++ libpp.so  -lotherlibs -o yourprog
Run Code Online (Sandbox Code Playgroud)

请记住,您可以将共享库与其他共享库链接。

当然,您需要修改您的构建系统,例如Makefile-s,以执行上述命令。

还要记住,某些函数具有 constructor function 属性(C++ 编译经常使用该属性来构造静态 C++ 实例)。这些函数之前运行过main;对称地,具有属性的函数destructor在 后运行main。对于由 加载的动态加载库dlopen,构造函数在 期间运行dlopen,析构函数在 期间运行dlclose

正如其他几位指出的那样,请注意跨 C 边界抛出的 C++ 异常