是否可以将.c和.cpp(来自openCV)编译和链接在一起?

时间:2014-03-04 19:25:39

标签: c++ c opencv compilation linker

我目前正在尝试制作一个程序,使用openCV从网络摄像头拍摄照片并执行图形操作以在openCV中查找区域,然后将其传递给.c程序,该程序仅通过信息将信息发送到服务器端口编程。

我的问题是,即使我为openCV .cpp代码中使用的函数创建了一个.h文件,并将其包含在我的.c中,仍然会出现错误error: expected ‘)’ before ‘&’ token

这是我的simpleIS.h:

int captureimg();
int backgroundsub();
void noisesuppression(Mat &ptr);
void simplegetarea(Mat &img);

extern int area1,area2,area3,area4;

任何想法?

2 个答案:

答案 0 :(得分:0)

您将不得不在其他C ++函数中包含所需的函数,并使这些函数具有extern“C”链接。您还必须拥有C数据结构,其中包含创建C ++类所需的内容。从C。中调用包装函数。

例如,如果您有这样的cpp函数:

int im_a_cxx_function(int , some_type, another_type &);

你创建了一个包装函数:

extern "C" int im_a_cxx_wrapper_function(int i, 
                                          struct some_C_type *st_C, 
                                          struct another_C_type *at_C)
{
    some_type st;
    another_type at;

    set_some_type(&st,  st_C);
    set_another_type(&at, at_C);

    return im_a_cxx_function(i, st, at);
}

然后,在包装函数的标题中:

#ifdef __cplusplus
extern "C" {
#endif
int im_a_cxx_wrapper_function(int i, struct some_C_type *st_C, 
                               struct another_C_type *at_C);
#ifdef __cplusplus
}
#endif

然后,在.c文件中包含包装器函数的标头,并正常调用包装器函数。主要的是,由于名称损坏,你不能在没有extern“C”的情况下调用函数,并且因为你不能控制库函数,所以你必须将它们包装起来。您还可以保存对C ++类型的不透明指针,但由于您不能使用构造函数,因此您通常必须至少为它们编写工厂和删除函数。

答案 1 :(得分:0)

下面应该做的工作。您的example.h文件:

#pragma once

#ifdef __cplusplus
extern "C" {
#endif
    int __declspec(dllexport) main(int argc, char** argv); // just modify this line !!!
#ifdef __cplusplus
}
#endif

在您的example.cpp文件中,仅进行更改:

extern "C" int main(int argc, char** argv)

您可能想要修改main()的函数名称或更改参数。