undefined reference to `cv::imwrite` || undefined reference to `cv::imread` 解决

现象

接手代码,cmake .. && make -j123,一气呵成,然后报错如下:
undefined reference to `cv::imwrite` || undefined reference to `cv::imread` 解决_第1张图片
说实在的,这种问题,没有一百也有八十了,找不到库嘛,气定神闲的打开CMakeLists.txt,

target_link_libraries(test
${LIBS_DIR}/lib/lib64/libopencv_core.so.3.4
${LIBS_DIR}/lib/lib64/libopencv_highgui.so.3.4
${LIBS_DIR}/lib/lib64/libopencv_imgproc.so.3.4
${LIBS_DIR}/lib/lib64/libopencv_videoio.so.3.4
${LIBS_DIR}/lib/lib64/libopencv_imgcodecs.so.3.4
)

嗯,已经包含,那么就是路径问题了,message(STATUS ${LIBS_DIR})打印路径
在这里插入图片描述
然后找一找,嗯~~小样。。
在这里插入图片描述
欸,MMP哦,咋有呢。。
不想啰嗦了,写解决方案吧。


环境

  • 系统: Centos 7.4
  • opencv by source: 3.4.5 (自己编译安装)
  • opencv by yum: 2.4.5 (yum install opencv)

解决方法

1. 比较目录结构,结构如下:

  • MyProject

    • include
    • lib
    • src
    • CMakeLists.txt

2. 分析:

我在CMakeLists.txt中 include_directories 包含了 ./include 路径,而 ./include 中没有 opencv2 目录。

3. 解决:

  1. include_directories 增加了 /usr/include ,因为我 yum install opencv-devel过,可是还是同样的错。
  2. 测试在 target_link_libraries 处指定 opencv 相关库均为 /usr/lib64 下 yum 安装的库。结果通过。
  3. 在 /usr/lib64 下执行 ls | grep imgcodecs,什么都没有,可是编译可以通过,猜测 opencv-2.4.5 可能是把 imread 封进了其他库比如(未证明,只是假如) libopencv_highgui.so,同时在头文件 highgui.hpp 做了相关声明。
    而我由于 ./include 中没有 opencv 头文件目录,项目包含了 /usr/include/opencv2 的文件,然后会去我指定的库 libopencv_highgui.so.3.4.5 找实现,而 opencv-3.4.5 把 imread 放在了 libopencv_imgcodecs.so 中,编译器当然就找不到实现了,所以报错。
  4. 说了这么多,解决方法就是 确认包含头文件和库文件的版本匹配

4.反思:

是时候把自己从 sudoer 里去掉了,平常手贱直接 yum 或者 apt-get 了, 终于吃到亏了。。


2019-4-3 更:

今天突然想到,所有的问题可能有一点原因就是 opencv2 和 opencv3 差很多。

你可能感兴趣的:(opencv,linux,C++,cmake)