为什么Opencv3.4.0使用make编译时出现错误?

为什么Opencv3.4.0使用make编译时出现错误?

问题描述:

环境:Debian(Raspiberry Pi Buster)

cmake version: 3.0.2

gcc version: 8.2.0

python version: 3.7.2

make version: 4.2.1

本来计划用opencv基于python进行图像辨别

在使用cmake配置完成后使用make命令编译:

sudo make

编译到大约90%时,出现如下错误:

#这是之前很多条控制台信息中的warning
warning: cast between incompatible function types from ‘PyObject* (*)(PyObject*, PyObject*, PyObject*)’ {aka ‘_object* (*)(_object*, _object*, _object*)’} to ‘PyCFunction’ {aka ‘_object* (*)(_object*, _object*)’} [-Wcast-function-type]

#make错误,退出
make[2]: *** [modules/python3/CMakeFiles/opencv_python3.dir/build.make:56: modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:21149: modules/python3/CMakeFiles/opencv_python3.dir/all] Error 2
make: *** [Makefile:138: all] Error 2

如图(图1中使用了make -i选项忽略错误,继续编译剩余部分,但open_cv python3没有成功编译):

图片说明

(图2显示了make的错误)

图片说明

#忽略错误后出现的c++error
c++: error: Cmakefiles/opencv_python3.dir/__/src2/cv2.cpp.o No such file or dictionary

在网上看到的编译错误的例子都和这个有所区别,没有能够很好地解决问题。有的说这是gcc编译器的问题

希望各位大佬们能够帮忙分析一下错误的原因,因为我的项目急需配置好opencv,也没有其它更好的替代,谢谢~

我和小伙伴解决了这个问题,我们的设备是树莓派3B。
方案一:如果你不需要opencv4.X的版本。先需要安装opencv的依赖库,再使用sudo apt-get install python3-opencv,就可以安装opencv,
并且不需要编译,opencv的版本是3.2.
方案二:如果需要opencv4.1.0版本,编译的过程比较顺利,安装成功。具体的步骤可以在网上找找,注意最好使用32G的内存卡,不然后面会卡住。当然了,我们也没弄懂那个错误的原因,但是还是解决了错误。
如果有大佬知道原因的话欢迎帮忙回答哈。

楼上_bobi_大佬的回答可以解决这个问题!但是我想帮小伙伴们补充完善一下。

1、找到 /home/pi/Downloads/opencv-3.4.0/modules/python/src2 中的这个文件 cv2.cpp (你们的路径应该和我差不多吧)
2、把第885行的 char* 改成 const char* (这里我和楼上的位置不一样,可能和系统版本有关。如果你们的也不一样的话,可以先定位到899行附近,然后在附近搜索char*,你会发现附近的char*前面都有const,只有一个地方前面没有const,就在那里加const。我的是在885行)
3、保存,再次编译sudo make && make install。最后进入python3成功显示cv版本号3.4.0

用手机截make过程中的图(跳太快了),看到前面编译的时候error 错误出在cv2.cpp里面 899行 将 char*=xxxx改为 const char*=xxxx 即可编译

编译的问题没有解决,但找到了知乎上一位大佬编译的预装opencv的镜像(同时预装TensorFlow)
链接:Here:
毕竟我的树莓派上没有重要的数据。。。

注意以下三点:
1. 压缩包中后缀为.z01的压缩文件要和第二个.zip文件一起解压(上传时拆分为两个)
2. SD卡需格式化为FAT32, 最好使用镜像烧写工具,如Etcher下载地址
3. 启动后使用Raspi-config扩展文件系统,否则存储空间会不准确

同时也希望知道对于问题中错误的解决方案的人能够回答以下这个问题。毕竟不是每个人的数据都输得起啊!