undefined reference to `png_init_filter_functions_neon'

本文解决在交叉编译OpenCV 3.3.1与FFmpeg使用LibPNG时遇到的undefined reference to `png_init_filter_functions_neon'错误。通过修改${HOME}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://blog.youkuaiyun.com/weixin_42330265/article/details/80484978

参考:
https://sourceforge.net/p/libpng/bugs/230/
https://github.com/opencv/opencv/issues/7600
报错:
undefined reference to `png_init_filter_functions_neon'
交叉编译 opencv3.3.1 ffmpeg libpng

修改
${HOME}/opencv-3.3.1/3rdparty/libpng/pngpriv.h
 128 /*#  if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \*/
 129 #   if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
--------------------- 
作者:weixin_42330265 
来源:优快云 
原文:https://blog.youkuaiyun.com/weixin_42330265/article/details/80484978 
版权声明:本文为博主原创文章,转载请附上博文链接!

[ 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
<think>好的,我现在需要解决用户遇到的编译错误,错误信息是关于`png_do_expand_palette_rgb8_neon`等未定义的引用。用户提到是在交叉编译OpenCV4.5.3时出现这个问题,并且引用了几个相关的资料,包括类似的错误和可能的解决方案。首先,我应该回忆一下这些错误通常的原因。NEON是ARM架构的SIMD指令集,用于优化性能。当编译器在链接阶段找不到这些NEON相关的函数时,可能是因为PNG库在编译时没有启用NEON支持,或者交叉编译时配置不正确,导致无法正确链接这些优化函数。根据用户提供的引用,尤其是引用[2]和[3],其他人在交叉编译时也遇到了类似的错误,解决办法包括禁用PNGNEON支持或者更新PNG库。例如,引用[2]提到解决办法是重新配置PNG库,禁用NEON。而引用[3]中的解决方法是更新libpng的版本,可能新版本已经修复了这个问题。接下来,我需要考虑可能的解决方案:1.**禁用PNGNEON支持**:在编译PNG库时,通过配置选项关闭NEON优化。例如,使用`--disable-arm-neon`选项。这样编译器就不会尝试链接这些NEON函数,从而避免未定义的引用错误。2.**更新PNG库版本**:用户可能使用了较旧版本的libpng,其中NEON支持存在问题。更新到新版本可能已经修复了兼容性问题,或者新版本的构建配置更合理,能够正确检测交叉编译环境。3.**检查交叉编译工具链的兼容性**:确保交叉编译工具链中的libpng库是否正确配置,是否支持目标平台的架构。可能需要指定正确的编译选项,如CPU架构参数,确保NEON指令集被正确识别和使用。4.**重新编译并链接正确的PNG库**:用户可能在交叉编译时没有正确链接到目标平台的PNG库,而是错误地链接了宿主机的库。需要确保在编译OpenCV时,PNG库的路径正确指向交叉编译后的版本,而非本地系统的库。另外,用户提到的是交叉编译,所以需要确保所有依赖库(包括PNG)也是用相同的交叉编译工具链编译的。如果宿主机的PNG库没有为ARM架构启用NEON支持,那么在交叉编译OpenCV时就会找不到这些符号。可能的步骤是指导用户重新编译libpng,并在编译时禁用NEON支持,或者确保NEON支持正确配置。此外,检查OpenCV的编译配置,确保在交叉编译时正确指向了这些库。 需要验证这些步骤是否正确,是否有其他潜在的问题。例如,禁用NEON可能会影响PNG处理的性能,但在无法正确编译的情况下,这可能是一个可行的临时解决方案。另外,用户可能需要安装或更新libpng的开发包,确保头文件和库文件都正确。最后,总结这些思路,形成逐步的解决方案,提供给用户,并生成相关问题,帮助用户进一步排查或优化他们的编译过程。</think>在交叉编译OpenCV时遇到`undefined reference to png_do_expand_palette_rgb8_neon`错误,通常是由于PNG库的NEON优化未正确配置或版本不兼容导致的。以下是具体解决方案: --- ### **分步解决方案** 1. **重新编译libpng并禁用NEON优化** - 进入libpng源码目录: ```bash ./configure --disable-arm-neon # 禁用NEON指令集支持 make clean && make ``` - 编译完成后,更新OpenCV的依赖库路径指向新编译的libpng。 2. **检查PNG库版本兼容性** - 若使用旧版libpng(如1.6.x),建议升级到**libpng ≥1.6.34**,该版本修复了NEON相关的编译问题[^3]。 - 验证版本: ```bash pkg-config --modversion libpng ``` 3. **配置OpenCV编译参数** - 在CMake中指定禁用PNGNEON优化: ```bash cmake -DWITH_PNG=ON -DPNG_ARM_NEON=OFF ... ``` - 确保`CMAKE_PREFIX_PATH`指向交叉编译后的libpng路径: ```bash cmake -DCMAKE_PREFIX_PATH=/path/to/cross-compiled-png ... ``` 4. **验证交叉编译工具链** - 检查交叉编译器是否支持ARMv8架构(含NEON): ```bash aarch64-linux-gnu-gcc -march=armv8-a+simd ... ``` - 若目标平台不支持NEON,需在编译libpng和OpenCV时**统一禁用NEON**。 --- ### **关键原理** NEON是ARM平台的SIMD指令集优化,若编译环境与目标平台架构不匹配(如x86环境交叉编译ARM时未正确配置NEON),会导致符号未定义错误。通过禁用NEON或更新库版本可规避此问题[^2][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值