Как правильно настроить связывание g ++ с opecv в Ubuntu 18.04? - PullRequest
0 голосов
/ 05 сентября 2018

Я новичок в opencv. И я обнаружил, что pkg-config --cflags --libs opencv -lopencv_core -lopencv_imgcodecs должен использоваться для плавной компиляции. Но я просто не знаю, почему при компиляции выдается ошибка «неопределенная ссылка», результаты вывода и мой Makefile выглядят следующим образом:

1. Для выходов:

g++ -Wall -g opencv.cpp
/tmp/ccg5WiIh.o: In function `main':
/home/akatsuki/Documents/Projects/simpleTest/opencv/opencv.cpp:14: undefined reference to `cv::imread(cv::String const&, int)'
/home/akatsuki/Documents/Projects/simpleTest/opencv/opencv.cpp:25: undefined reference to `cv::namedWindow(cv::String const&, int)'
/home/akatsuki/Documents/Projects/simpleTest/opencv/opencv.cpp:26: undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
/home/akatsuki/Documents/Projects/simpleTest/opencv/opencv.cpp:29: undefined reference to `cv::imwrite(cv::String const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)'
/home/akatsuki/Documents/Projects/simpleTest/opencv/opencv.cpp:31: undefined reference to `cv::waitKey(int)'
/tmp/ccg5WiIh.o: In function `cv::String::String(char const*)':
/usr/include/opencv2/core/cvstd.hpp:622: undefined reference to `cv::String::allocate(unsigned long)'
/tmp/ccg5WiIh.o: In function `cv::String::~String()':
/usr/include/opencv2/core/cvstd.hpp:664: undefined reference to `cv::String::deallocate()'
/tmp/ccg5WiIh.o: In function `cv::Mat::~Mat()':
/usr/include/opencv2/core/mat.inl.hpp:592: undefined reference to `cv::fastFree(void*)'
/tmp/ccg5WiIh.o: In function `cv::Mat::release()':
/usr/include/opencv2/core/mat.inl.hpp:704: undefined reference to `cv::Mat::deallocate()'
/tmp/ccg5WiIh.o: In function `cv::Mat::operator=(cv::Mat&&)':
/usr/include/opencv2/core/mat.inl.hpp:1215: undefined reference to `cv::fastFree(void*)'
collect2: error: ld returned 1 exit status
Makefile:16: recipe for target 'opencv.o' failed
make: *** [opencv.o] Error 1

2. Для Makefile:

CC = g++
CCFLAG = -Wall -g
Linker = `pkg-config --cflags --libs opencv` -lopencv_core -lopencv_imgcodecs

all: opencv.exe

opencv.exe: opencv.o
    g++ -o $@ opencv.o $(Linker)
    chmod a+x $@

opencv.o: opencv.cpp
    $(CC) $(CCFLAG) opencv.cpp

Может ли кто-нибудь помочь мне разобраться в проблеме? Благодаря ~

1 Ответ

0 голосов
/ 07 марта 2019

Для тех, кто ищет актуальные вопросы, я оставляю ответ.

Следующая команда печатает каталоги заголовочных файлов OpenCV.

pkg-config --cflags opencv
// -I/usr/local/include/opencv -I/usr/local/include

Следующая команда печатает общие объектные файлы
(в каталоге /usr/local/lib в следующем случае)
которые используются для динамического связывания.
Динамическое связывание - это ссылка на ваш исполняемый файл (например, main file)
к общим объектным файлам (например, .so files) во время выполнения

pkg-config --libs opencv
// -L/usr/local/lib -lopencv_cudabgsegm -lopencv_cudaobjdetect 
// -lopencv_cudastereo -lopencv_stitching -lopencv_cudafeatures2d 
// -lopencv_superres -lopencv_cudacodec -lopencv_videostab 
// ...

Вы можете использовать вышеперечисленные зависимости
(каталоги заголовочных файлов и общие объектные файлы) в вашей команде компиляции
написав pkg-config --cflags opencv и pkg-config --libs opencv

g++ `pkg-config --cflags opencv` \
-o main \
/your_cpp_file_path/source.cpp \
`pkg-config --libs opencv`


Обратите внимание, что ` является символом обратного тона, а не '
используется символ обратной галочки в команде linux
использовать результат команды в команде

Например, эта часть pkg-config --cflags opencv заменена
с результатом pkg-config --cflags opencv

...