未定义的引用...使用 OpenCV 编译 C++ 代码时,从命令行

Undefined reference to... when compiling c++ code with opencv, from command line

提问人:Maurizio Morando 提问时间:10/25/2018 最后编辑:Maurizio Morando 更新时间:10/26/2018 访问量:3629

问:

首先对不起我的英语不好,然后,这看起来像是简单的问题,但我尝试了一切来解决它,但没有任何效果。我已经安装了 OpenCv3.2,并且正确安装了 build-essential。

我在上面链接了我的包含和错误。

包括:

#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()'

----------------------解决----------------------

感谢大家的帮助,但是发生错误是因为我的设备上安装了多个版本的OpenCv。我卸载了所有opencv版本,然后从源代码重新安装了它。我希望这对某人有所帮助。

C++ opencv 编译 未定义引用 imshow

评论

0赞 463035818_is_not_an_ai 10/25/2018
请注意,ld 是链接器,因此编译实际上是成功的,但错误是在链接期间。
0赞 Bjoern Urban 10/25/2018
你有没有尝试过这里提到的来源--cflags --libs opencv
0赞 Maurizio Morando 10/25/2018
是的,对不起,解释中的错误很小,无论如何我正在尝试一切,但也链接了所有 opencv 库,错误仍然存在。
0赞 Maurizio Morando 10/25/2018
@BjoernUrban是的,我尝试,终端上出现同样的错误。

答:

0赞 Matthieu Brucher 10/25/2018 #1

您需要按正确的顺序提供库。在这里,您需要在行中推送稍后(就在之前)提供的库。cv::Stringopencv_core

链接器的工作原理是逐步组装输出,在每个输出之后使用所需的内容,然后删除不需要的内容。因此,如果更高版本的库需要以前的库,则会失败,因为链接器不会遍历外部库。-l

正如 #BjoernUrban 所说,正确的顺序是由 给出的。pkg-config --libs opencv