Неопределенная ссылка на ... при компиляции кода c ++ с помощью opencv из командной строки - PullRequest
0 голосов
/ 25 октября 2018

в первую очередь извините за мой плохой английский, потом, это выглядит как простая проблема, но я пытался все решить, и ничего не получалось.Я установил OpenCv3.2 и правильно установил существенную сборку.

Я связываю свое включение и ошибку выше.

Включите:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/videoio.hpp>

Код, который соединяется ссгенерировать ошибку:

Mat image = Mat::zeros( 1080, 1920, CV_8UC3 );
imshow("Image",image);

Строка компиляции:

g++ -o FD-progetto-vista-telecamera -O3 -std=gnu++11 -Wall ../FD-super_tracker.cpp -L/usr/local/lib/ -I/usr/local/include/ -lopencv_dnn -lopencv_ml -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_photo -lopencv_imgcodecs -lopencv_video -lopencv_objdetect -lopencv_imgproc -lopencv_flann -lopencv_core -lmysqlclient -lboost_system -lboost_filesystem -lm -ldl -ltiff

Ошибка компиляции:

/tmp/cc7wFBb0.o: In function `project(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, Telecamera_coord*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, Telecamera_coord*> > >)':
FD-super_tracker.cpp:(.text+0xbdd): undefined reference to `cv::String::allocate(unsigned long)'
FD-super_tracker.cpp:(.text+0xbf9): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
FD-super_tracker.cpp:(.text+0xc01): undefined reference to `cv::String::deallocate()'
FD-super_tracker.cpp:(.text+0x1180): undefined reference to `cv::String::deallocate()'
collect2: error: ld returned 1 exit status

Обновление:

Я тоже пробовал с этимварианты (как предложено):

g++ -o FD-progetto-vista-telecamera -O3 -std=gnu++11 -Wall ../FD-super_tracker.cpp -L/usr/local/lib/ -I/usr/local/include/ `pkg-config --libs opencv` -lmysqlclient -lboost_system -lboost_filesystem -lm -ldl -ltiff

И вот результат:

/tmp/ccklBhL2.o: In function `project(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, Telecamera_coord*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, Telecamera_coord*> > >)':
FD-super_tracker.cpp:(.text+0xbdd): undefined reference to `cv::String::allocate(unsigned long)'
FD-super_tracker.cpp:(.text+0xbf9): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
FD-super_tracker.cpp:(.text+0xc01): undefined reference to `cv::String::deallocate()'
FD-super_tracker.cpp:(.text+0x1180): undefined reference to `cv::String::deallocate()'

----------------------SOLVED ----------------------

Спасибо всем за помощь, но возникает ошибка, потому что у меня установлено несколько версий OpenCvустройство.Я удалил все версии OpenCV, а затем переустановил его из исходного кода.Я надеюсь, что это будет полезно для кого-то.

1 Ответ

0 голосов
/ 25 октября 2018

Вам необходимо предоставить библиотеки в правильном порядке.Здесь вам нужно вставить в строку библиотеку, которая обеспечивает cv::String позже (непосредственно перед opencv_core).

Компоновщик работает, последовательно собирая выходные данные, используя то, что требуется после каждого -l,затем отбрасываем то, чего нет.Поэтому, если более поздним библиотекам требуются предыдущие библиотеки, он завершается ошибкой, потому что компоновщик не зацикливается на внешних библиотеках.

Как сказал #BjoernUrban, правильный порядок задается как pkg-config --libs opencv.

...