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

50 篇文章 3 订阅
10 篇文章 1 订阅

现象

接手代码,cmake .. && make -j123,一气呵成,然后报错如下:
在这里插入图片描述
说实在的,这种问题,没有一百也有八十了,找不到库嘛,气定神闲的打开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 差很多。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值