在使用opencv时候可能会遇到undefined reference to cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'
其主旨原因是使用的函数版本和引用的库函数版本不一至,要确保使用的函数和引用的库函数版本一致。

1、如何知道函数版本和引用的是否一样

1.1使用nm对目标文件进行分析
  1. 生成.o文件
g++ -E -I/usr/local/include/opencv4/ -L/usr/local/lib -lopencv_highgui  -lopencv_imgcodecs -lopencv_imgproc -lopencv_core  /home/lvrobot/OpencvStudy/fangwenyuansu.cpp -o /home/lvrobot/OpencvStudy/fangwenyuansu.i  //预处理
g++ -S -I/usr/local/include/opencv4/ -L/usr/local/lib -lopencv_highgui  -lopencv_imgcodecs -lopencv_imgproc -lopencv_core  /home/lvrobot/OpencvStudy/fangwenyuansu.i -o /home/lvrobot/OpencvStudy/fangwenyuansu.s //编译
g++ -c -I/usr/local/include/opencv4/ -L/usr/local/lib -lopencv_highgui  -lopencv_imgcodecs -lopencv_imgproc -lopencv_core  /home/lvrobot/OpencvStudy/fangwenyuansu.s -o /home/lvrobot/OpencvStudy/fangwenyuansu.o  //汇编
  1. 使用nm -C fangwenyuansu.o 查看使用的外部函数
U cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)
U cv::imshow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)
  1. 查看引用库对应的函数类型,这里主要是对libopencv_imgcodecs.a,libopencv_highgui.a进行查看(根据使用的函数进行)nm -C libopencv_highgui.a/ nm -C libopencv_imgcodecs.a
 U cv::imshow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)
 T cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)

主要查看函数签名是否一致。

2、解决问题

2.1、函数版本不一致

编译使用的C++,gcc编译器等版本不一致会导致函数版本不一致

查阅资料说以下方法可以解决

  • 在编译的时候加上-D_GLIBCXX_USE_CXX11_ABI=0即可(参考《g++命令行参数》的-Dmacro=defn部分)。
  • 在每个源文件中添加一个宏定义:# define _GLIBCXX_USE_CXX11_ABI 0。
    可自行尝试
  • 在本地环境重新编译,确保编译opencv的编译器与环境和使用的一样
2.2、函数版本一致,环境中有多个opencv导致使用的头文件和库不对应

编译opencv时开启-D OPENCV_GENERATE_PKGCONFIG=ON
(cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_GENERATE_PKGCONFIG=ON -D INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_C_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH= …/opencv4/opencv_contrib/modules -D OPENCV_EXAMPLES=ON …)

使用pkg-config --cflags opencv4 获取opencv头文件路径

-I/usr/local/include/opencv4

使用pkg-config --libs opencv4 获取库路径

-L/usr/local/lib -lopencv_gapi -lopencv_highgui -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_video -lopencv_calib3d -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core

可以全部加入,最好根据使用的函数选择的引用

2.3、函数版本和路径都是对应没有问题的时候,应该注意一下引用库的路径

正确的编译命令

g++ -g -I/usr/local/include/opencv4/ /home/lvrobot/OpencvStudy/fangwenyuansu.cpp -o /home/lvrobot/OpencvStudy/fangwenyuansu -L/usr/local/lib -lopencv_highgui  -lopencv_imgcodecs -lopencv_imgproc -lopencv_core  

在这里插入图片描述
不正确的编译命令(引用库的位置不对)

g++ -g -I/usr/local/include/opencv4/ -L/usr/local/lib -lopencv_highgui  -lopencv_imgcodecs -lopencv_imgproc -lopencv_core /home/lvrobot/OpencvStudy/fangwenyuansu.cpp -o /home/lvrobot/OpencvStudy/fangwenyuansu 

在这里插入图片描述
这个也要注意一下

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐