解决 Ubuntu 20.04 上编译 OpenCV 3.2 时的类型不匹配错误

server/2024/12/19 20:00:40/

解决 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 返回的数据类型,使得代码能够顺利编译并生成正确的二进制文件。这种做法虽然简单,但针对具体的编译错误非常有效,尤其是在跨语言接口中常见的类型不匹配问题上。


http://www.ppmy.cn/server/151528.html

相关文章

SpringBoot feign基于HttpStatus重试

场景 基于springboot开发的项目,对接第三方,第三方的接口有限流策略,某个时间段内有调用频率限制,返回的状态码HttpStatus不是200,而HttpStatus是429。现基于HttpStatus我们发起的重试。 技术点 springbootfeign fe…

机器学习周报(12.9-12.15)

文章目录 摘要Abstract 1 Swin Transformer1.1 输入1.2 Patch Partition1.3 Linear Embedding1.4 Patch Merging1.5 Swin Transformer Block1.6 代码总结 摘要 本篇博客介绍了采用类似于卷积核的移动窗口进行图像特征提取的Swin Transformer网络模型,这是一种基于T…

前端使用xlsx.js实现 Excel 文件的导入与导出功能

前端使用xlsx.js实现 Excel 文件的导入与导出功能 在现代的 Web 开发中,处理文件上传和导出功能已经变得越来越常见,尤其是 Excel 文件的导入与导出。 我们将使用 Vue.js 和 XLSX.js 库来处理 Excel 文件的读取和生成。XLSX.js 是一个强大的 JavaScrip…

基于python对网页进行爬虫简单教程

python对网页进行爬虫 基于BeautifulSoup的爬虫—源码 """ 基于BeautifulSoup的爬虫### 一、BeautifulSoup简介1. Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要…

python模拟练习第一期

问题一 如果一个数 p 是个质数,同时又是整数 a的约数,则 p 称为 a的一个质因数。 请问 2024 有多少个质因数? 步骤 1: 分解 2024 首先,2024 是偶数,说明可以被 2 整除。我们从 2 开始进行除法分解: 202…

springcloud-gateway获取应用响应信息乱码

客户端通过springcloud gateway跳转访问tongweb上的应用,接口响应信息乱码。使用postman直接访问tongweb上的应用,响应信息显示正常。 用户gateway中自定义了实现GlobalFilter的Filter类,在该类中获取了上游应用接口的响应信息,直…

CRMEB PHP多商户版DOCKER部署实战

#首先,制作docker 镜像# 官方有一个镜像,但是拉不来下,也不知道是没是没有维护,嘎了。只能自己动手做一个。 这里选择ubuntu 24 为基础,制作crmeb-mer的镜像,Dockerfile内容如下: # 使用官方…

【AIGC】与模型对话:理解与预防ChatGPT中的常见误解

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯模型的工作原理和用户期望差异人工智能模型的基本工作原理认知上的局限与误解用户期望与模型实际能力的差距精确理解用户意图的重要性实际应用中的建议 &…