Ошибка компиляции OpenCV C ++ / C: неопределенная ссылка на `cv :: fastFree (void *) ‘

Я пытаюсь заставить программу на C вызывать функцию в файле C ++, который использует OpenCV. Я могу заставить файл 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);}

Makefile

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

При комментировании всех строк OpenCV в файле foo.cpp возвращается следующий вывод:

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

Закомментировав строку «Мат изображения;» выдает следующую ошибку:

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

Кто-нибудь может помочь? Заранее благодарим вас за помощь в этом вопросе, это очень ценится.

3

Решение

Это не ошибка компиляции, а ошибка компоновки.

Я подозреваю, что вы не знакомы с фазами сборки C ++. В вашем make-файле есть правила компиляции (foo.o) и компоновки (mot). Оба теперь содержат pkg-config --libs opencv, Тем не менее, вы должны передавать библиотеку только при линковке; На этапе компиляции нужны только заголовки OpenCV.

Какой выход pkg-config --libs opencv? Это команда оболочки для получения вашей локальной установки OpenCV. Возможно, он настроен неправильно или не настроен вообще.

1

Другие решения

Проблема была с фазой связывания. Мне пришлось передать совместно используемую библиотеку компилятору gcc, чтобы программа на C могла ссылаться на код C ++, который не был искажен.

0

По вопросам рекламы [email protected]