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

时间:2012-12-24 11:48:06

标签: 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, 纪尧姆。

2 个答案:

答案 0 :(得分:3)

除了Azzy的答案之外,这个问题的真正答案实际上是你需要做什么来调用你的c ++代码的问题。

使用fork可能是一个好主意,但总的来说,我认为这不是正确的解决方案,除非C ++代码首先需要花费大量时间来执行[在这种情况下fork / exec开销是小到不重要]。

通常,正确的解决方案是使用C接口(以及extern "C"包装器)在程序和C ++代码之间编写一个小接口 - 不要忘记使用#ifdef __cplusplus定义接口的标头,围绕extern "C",以便您可以在C ++接口实现和调用C代码中使用相同的头文件。

还要注意例外情况。你不能调用从C中抛出异常的C ++代码 - 它们必须用C ++处理,否则会发生坏事(究竟是什么样的坏事无法确定 - 随机代码可能被执行,或者系统崩溃,或者一些随机错误输出发生等)

答案 1 :(得分: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

然后在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

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

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

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

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