集成C和C ++程序

时间:2014-03-10 03:43:47

标签: c++ c

我正在尝试使用图像处理来控制无人机。 从无人机捕获的图像是一个opencv C ++程序。 无人机控制程序是C程序。 现在我想整合这两个程序,以便我运行一个程序,通过它我可以获得两个图像并控制无人机。我怎么做? 我的C程序是一个套接字程序,用于向无人机发送命令,C ++程序用于从tcp套接字中捕获来自无人机的图像流。 有没有办法做或者我应该将整个程序转换成另一种语言? 任何人都可以提供帮助。

的问候, shiksha

2 个答案:

答案 0 :(得分:3)

您有很多选择。最简单的可能是简单地将*.c文件重命名为*.cpp - 它们可以直接在C ++中编译。然后,您可能会遇到一些与使用C编译器构建的外部库链接的问题。这些链接问题通常可以通过保护每个标题包含

来解决
extern "C" {
    #include "header_for_c_library.h"
}

如果这不可行(例如,如果您的C项目包含大量文件,或者您希望继续在C中编译),您可能希望将C部分构建为静态库并将其与C ++链接程序。您可以转向另一个方向 - 将C ++组件构建为静态库并将其与C程序链接。这样做的缺点是你必须为你的C ++代码编写一个C包装器,这可能需要一些努力(或者根本不可能,取决于你在API中使用的C ++的哪些特性)。必须注意确保包装器链接为C,以使符号与C产生的符号兼容。

答案 1 :(得分:2)

在C ++程序中使用C libs是重用该功能的常用方法。 这些语言可以一起构建。通常C ++代码调用提供所需功能的C-模块API。

在这种情况下,您只需将C文件添加到C ++项目中并构建一个可执行文件。

您应该只考虑C和C ++中的不同链接。应使用extern "C"标准链接规范编译C函数声明。 C库通常已在头文件中包含此类代码(如果不是 - 添加它):

#ifdef __cplusplus
    extern "C" { 
#endif

并在文件的末尾

#ifdef __cplusplus
    }
#endif

extern“C”阻止C ++编译器更改函数名称。由于C ++支持重载,C ++编译器会将有关函数参数的信息添加到函数名称中,因此称为name mangling。不应该对C库代码进行此操作。