8

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

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

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

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

我对 C++ 了解不多,但我不想为这个特定的用例编写 C++ STL/C 包装器。

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

如果有人有线索/方向/提示,那将不胜感激。

谢谢,纪尧姆。

4

2 回答 2

3

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

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

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

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

于 2012-12-24T12:09:51.397 回答
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 函数属性(C++ 编译经常使用它来构造静态 C++ 实例)。这些函数之前运行过main;对称地,具有destructor属性的函数在main. 对于由 加载的动态加载库dlopen,构造函数在 期间运行,dlopen而析构函数在dlclose.

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

于 2012-12-24T12:00:48.253 回答