解决 Ubuntu 20.04 上编译 OpenCV 3.2 时的类型不匹配错误
make[2]: *** [modules/python3/CMakeFiles/opencv_python3.dir/build.make:329:modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:11856:modules/python3/CMakeFiles/opencv_python3.dir/all] 错误 2
make: *** [Makefile:163:all] 错误 2
分析编译错误原因:
当在 Ubuntu 20.04 上从源代码编译安装 OpenCV 3.2 时,遇到的编译错误表明 cv2.cpp
文件在编译过程中出现问题。特别是,错误提示集中在 cv2.cpp.o
的生成上,这是 Python 接口文件的编译输出对象。此错误可能是由于 C++ 和 Python 接口间的类型不匹配或者 API 已经更新而代码未跟进引起的。
具体错误分析:
make[2]: *** [modules/python3/CMakeFiles/opencv_python3.dir/build.make:329: modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o] Error 1
- 这一行表示在执行编译命令时,处理
cv2.cpp
文件时遇到错误,导致无法成功生成对象文件.o
。
- 这一行表示在执行编译命令时,处理
make[1]: *** [CMakeFiles/Makefile2:11856: modules/python3/CMakeFiles/opencv_python3.dir/all] Error 2
- 此行表明编译整个 Python 模块时遇到问题,且因为依赖的部分编译失败,整个模块编译无法继续。
make: *** [Makefile:163: all] Error 2
- 最顶层的 Makefile 在尝试完成所有编译任务时遇到了阻碍,整个构建进程因此终止。
解决方案与实施步骤:
1. 诊断错误具体原因:
- 在编译时添加
VERBOSE=1
参数,重新运行make
命令以获取更详细的错误输出:make VERBOSE=1
- 仔细检查编译错误指向的代码行以及周围的上下文。
2. 应用代码修改:
- 仿照在树莓派上成功修改 OpenCV 源代码的案例,考虑对
cv2.cpp
的相似行进行类型转换处理。找到对应的代码行(在错误输出中应有指示或者近似行数):char* str = (char *)PyString_AsString(obj); // 添加 (char *) 转换
- 此修改强制将
PyString_AsString
的返回值转换为char*
类型,这可能是必要的,特别是如果 Python API 的返回类型与期待的 C++ 类型不一致时。
3. 修改并重新编译 OpenCV:
- 修改后保存
cv2.cpp
文件。 - 清理之前的编译结果并重新编译:
make clean cmake . make -j$(nproc)
- 这里使用
-j$(nproc)
以利用所有可用的处理器核心来加速编译过程。
4. 安装和验证:
- 如果编译无误,运行安装命令:
sudo make install
- 安装后,检验 OpenCV 是否能在 Python 中正确加载:
python -c "import cv2; print(cv2.__version__)"
解释为何此解决方案有效:
此解决方案通过对可能出现类型不匹配的代码行添加显式类型转换,直接解决了 C++ 和 Python API 之间的兼容性问题。这种类型转换确保了编译器可以正确理解和处理 Python 返回的数据类型,使得代码能够顺利编译并生成正确的二进制文件。这种做法虽然简单,但针对具体的编译错误非常有效,尤其是在跨语言接口中常见的类型不匹配问题上。