OpenCV C ++ / C编译错误:对`cv :: fastFree(void *)'

时间:2015-07-13 15:34:44

标签: c++ opencv compiler-errors undefined-reference pkg-config

我正在尝试让C程序在使用OpenCV的C ++文件中调用函数。我可以让C文件在C ++文件中调用一个基本的整数函数并返回一个结果,但每当我尝试将一些OpenCV代码添加到C ++文件时,我就会遇到编译错误。这是我在每个模块中的简单代码:

Foo.cpp中

#include <time.h>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/mat.hpp"
#include "opencv/cv.hpp"

#include <iostream>

#ifdef _cplusplus 
extern "C" int f(int);
#endif 

using namespace std;
using namespace cv;

int f(int i)
{
cout << "CPP SON: " << i << endl;
i--;

//Mat image;

//image = imread( "image1.jpg", 1 );

//namedWindow( "image1.jpg", CV_WINDOW_AUTOSIZE );

//imshow( "image1.jpg", image );

//waitKey(0);

return i;
}

bar.c

#include <stdio.h>

int global = 0;

int f(int);

void cc(int i)
{
    global = f(i);
    /* ... */
    printf("hello from C! %d \n", global);
}

int main(int argc, char *argv[]) {

    printf("this si is the C code called main\n");
    cc(32);


}

生成文件

mot : foo.o bar.o
    g++ `pkg-config --cflags opencv` -o mot `pkg-config --libs opencv` foo.o bar.o

foo.o : foo.cpp
    g++ `pkg-config --cflags opencv` -c foo.cpp `pkg-config --libs opencv` -o foo.o

bar.o : bar.c
    g++ `pkg-config --cflags opencv` -c bar.c `pkg-config --libs opencv` -o bar.o

clean : 
    rm foo.o
    rm bar.o
    rm mot

在foo.cpp文件中注释掉所有OpenCV行时,会返回以下输出:

bi@rtes4:~/Desktop$ make
g++ `pkg-config --cflags opencv` -c foo.cpp `pkg-config --libs opencv` -o foo.o
g++ `pkg-config --cflags opencv` -c bar.c `pkg-config --libs opencv` -o bar.o
g++ `pkg-config --cflags opencv` -o mot `pkg-config --libs opencv` foo.o bar.o
bi@rtes4:~/Desktop$ ./mot
this si is the C code called main
CPP SON: 32
hello from C! 31 

评论出“Mat image;”这一行产生以下错误:

bi@rtes4:~/Desktop$ make
g++ `pkg-config --cflags opencv` -c foo.cpp `pkg-config --libs opencv` -o foo.o
g++ `pkg-config --cflags opencv` -c bar.c `pkg-config --libs opencv` -o bar.o
g++ `pkg-config --cflags opencv` -o mot `pkg-config --libs opencv` foo.o bar.o
foo.o: In function `cv::Mat::~Mat()':
foo.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x39): undefined reference to `cv::fastFree(void*)'
foo.o: In function `cv::Mat::release()':
foo.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x47): undefined reference to `cv::Mat::deallocate()'
collect2: error: ld returned 1 exit status
make: *** [mot] Error 1

有人可以借给他们任何帮助吗?非常感谢您提前帮助解决此问题,非常感谢。

2 个答案:

答案 0 :(得分:1)

它不是编译错误,而是链接错误。

我怀疑你不熟悉C ++的构建阶段。你的makefile有编译(foo.o)和链接(mot)的规则。两者现在都包含pkg-config --libs opencv。但你应该只在链接时通过图书馆;编译步骤只需要OpenCV标题。

pkg-config --libs opencv的输出是什么?这是获取本地OpenCV安装的shell命令。它可能配置错误或根本没配置。

答案 1 :(得分:0)

问题在于连接阶段。我必须将共享库传递给gcc编译器,以便C程序能够引用尚未被破坏的C ++代码。