opencv交叉编译报错:undefined reference to `png_riffle_palette_neon

NEON 概述

NEON(Nested Enhanced Vector Instruction Set)是 ARM 架构中的一种高级 SIMD(Single Instruction, Multiple Data,单指令多数据)扩展技术。它专为加速多媒体和信号处理任务而设计,允许在单个指令周期内同时处理多个数据点,从而显著提升处理器的并行计算能力。

错误原因分析

在交叉编译 OpenCV 时,遇到undefined reference to png_riffle_palette_neon` 错误,通常是由于 NEON 相关函数未正确编译或链接导致的。以下是可能的原因:

  1. 编译目标平台未正确指定:如果编译目标平台是 ARM 架构,但未正确指定 CMAKE_SYSTEM_PROCESSOR,导致编译器未启用 NEON 支持。

  2. NEON 未启用或配置错误:即使目标平台支持 NEON,如果在编译时未启用 NEON 支持,或者配置错误,可能导致 NEON 相关函数未编译或链接。

  3. 第三方库(如 libpng)未正确编译:OpenCV 依赖于第三方库如 libpng,如果这些库未正确编译或未启用 NEON 支持,也可能导致此错误。

解决方案

  1. 确认编译目标平台

    首先,确认编译目标平台是否为 ARM 架构。如果是 ARM 平台,确保在编译时指定了正确的处理器类型。例如,使用以下命令指定目标平台为 aarch64(如果是 32 位 ARM 平台,则将aarch64替换为arm)

    cmake -DCMAKE_SYSTEM_PROCESSOR=aarch64 ..
    
     

    如果 OpenCV 是一个子模块,则在引入 OpenCV 之前添加以下设置:

    set(CMAKE_SYSTEM_PROCESSOR aarch64)
    
  2. 启用 NEON 支持

    在编译 OpenCV 时,确保启用了 NEON 支持。可以在 CMake 命令中添加以下选项:

    cmake -DENABLE_NEON=ON ..
    
     

    如果 OpenCV 是一个子模块,则在 CMakeLists.txt 中添加以下设置:

    set(ENABLE_NEON ON)
    
  3. 强制禁用PNG NEON加速

    如果以上方法都不可行,则可以强制禁用PNG NEON加速,修改以下代码opencv/3rdparty/libpng/pngpriv.h

    /*# if (defined(ARM_NEON) || defined(__ARM_NEON)) && */
    #if defined(PNG_ARM_NEON) && (defined(ARM_NEON) || defined(__ARM_NEON))
    

      4.禁用PNG

         如果禁用PNG NEON都不行,那只能选择禁用PNG了,但是不建议这样做,报这种错多半还是配置不对,建议在CMakeList.txt里添加打印跟踪,此外还可以在执行cmake后在输出路径下(有个CMakeCache.txt) 执行cmake -L 查看变量配置,确认是否有啥冲突

cmake -DBUILD_PNG=OFF ..
或者set(BUILD_PNG OFF)

总结

undefined reference to png_riffle_palette_neon` 错误通常是由于 NEON 相关函数未正确编译或链接导致的。通过确认编译目标平台、启用 NEON 支持、检查第三方库的编译配置,并重新编译 OpenCV,可以有效解决此问题。确保在编译过程中正确配置 NEON 支持,以充分发挥 ARM 架构的性能优势。

[ 39%] Building CXX object modules/photo/CMakeFiles/opencv_photo.dir/src/tonemap.cpp.o [ 39%] Linking CXX shared library ../../lib/libopencv_imgcodecs.so /home/mao/gcc-linaro-1400-202306-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/14.0.0/../../../../aarch64-linux-gnu/bin/ld: ../../3rdparty/lib/liblibpng.a(pngrtran.c.o): in function `png_do_read_transformations': pngrtran.c:(.text.png_do_read_transformations+0x1178): undefined reference to `png_riffle_palette_neon' /home/mao/gcc-linaro-1400-202306-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/14.0.0/../../../../aarch64-linux-gnu/bin/ld: pngrtran.c:(.text.png_do_read_transformations+0x21d0): undefined reference to `png_do_expand_palette_rgba8_neon' /home/mao/gcc-linaro-1400-202306-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/14.0.0/../../../../aarch64-linux-gnu/bin/ld: pngrtran.c:(.text.png_do_read_transformations+0x325c): undefined reference to `png_do_expand_palette_rgb8_neon' /home/mao/gcc-linaro-1400-202306-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/14.0.0/../../../../aarch64-linux-gnu/bin/ld: ../../3rdparty/lib/liblibpng.a(pngrutil.c.o): in function `png_read_filter_row': pngrutil.c:(.text.png_read_filter_row+0xac): undefined reference to `png_init_filter_functions_neon' collect2: 错误: ld 返回 1 make[2]: *** [modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/build.make:457:lib/libopencv_imgcodecs.so.4.10.0] 错误 1 make[1]: *** [CMakeFiles/Makefile2:2515:modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/all] 错误 2
最新发布
03-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值