我有一个客户端提供了一个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.
您可以使用 链接共享 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++ 异常