现象
接手代码,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. 解决:
- 在 include_directories 增加了 /usr/include ,因为我
yum install opencv-devel
过,可是还是同样的错。 - 测试在 target_link_libraries 处指定 opencv 相关库均为 /usr/lib64 下 yum 安装的库。结果通过。
- 在 /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.反思:
是时候把自己从 sudoer 里去掉了,平常手贱直接 yum 或者 apt-get 了, 终于吃到亏了。。
2019-4-3 更:
今天突然想到,所有的问题可能有一点原因就是 opencv2 和 opencv3 差很多。