完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
环境与源码包
宿主机:Ubuntu16.04 x86 目标平台:RP-RK1808,aarch64 交叉编译工具链:gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu 架构-操作系统-程序二进制接口约定 aarch64-linux-gnu 依赖关系: opencv(3.4.3) |--------zlib(1.2.11) |--------ffmpeg(4.2.1) |--------x264(20181217(0.161.x)) |--------xvidcore(1.3.3) 注意,网上部分教程说需要下载ffmpeg依赖项 apt-get install libavcodec-dev libavformat-dev libswscale-dev 但是交叉编译并不需要这个,并且这个可能会影响后面的交叉编译,使得看起来找到了ffmpeg依赖项,但是交叉编译之后无法使用。 这是因为直接下载的依赖项是x86架构的,而目标平台是aarch64架构的。 依赖项的查找依靠pkgconfig工具,依靠*.pc文件。 而FFMPEG始终为NO的解决就依靠pkgconfig工具,具体见4.opencv交叉编译 相关源码包以及交叉编译好的文件等有时间了再放链接吧。 注意,本教程因为写的时候离编译较久,可能有许多错误之处,切勿全抄,思考着编译。 以下是本篇文章正文内容。 一、交叉编译是什么? 简单来说,交叉编译就是在宿主机上编译可以在目标机上运行的代码。 二、使用步骤 1.交叉编译zlib 前期准备 sudo gedit /root/.bashrc export PATH=$PATH:/home/rpdzkj/cfan/Source/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin//指定交叉编译工具链目录 export OPENCV_DEPEND=/usr/local/arm/opencv-depend export OPENCV_INSTALL=/usr/local/arm/opencv-install source /root/.bashrc//使生效 aarch64+tab//测试,是否会自动补齐出aarch64-linux-gnu-gcc、g++等,补齐则生效 //进入解压得到的zlib文件夹 ./configure --prefix=$OPENCV_DEPEND//指定安装目录 1 之后,对Makefile文件进行修改,修改内容如下: CC=aarch64-linux-gnu-gcc LDSHARED=aarch64-linux-gnu-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map AR=aarch64-linux-gnu-ar RANLIB=aarch64-linux-gnu-ranlib 最后 make 1 2.libx264的交叉编译 cd /home/rpdzkj/lib/x264-master gedit config.mak CC=aarch64-linux-gnu-gcc LDSHARED=aarch64-linux-gnu-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map AR=aarch64-linux-gnu-ar RANLIB=aarch64-linux-gnu-ranlib STRIP=aarch64-linux-gnu-strip make install 报错libx264.a(bitstream-8.o): In function x264_8_bitstream_init': bitstream.c:(.text+0x19c): undefined reference tox264_8_nal_escape_neon’ bitstream.c:(.text+0x1a0): undefined reference to `x264_8_nal_escape_neon’ 很多未定义,我去官网下载了源码包之后解决 3.libxvid交叉编译 cd /home/rpdzkj/lib/xvidcore-1.3.3 cd ./build/generic ./configure --prefix=$OPENCV_DEPEND --host=aarch64-linux --disable-assembly 按照教程来的话,这一步采用的编译工具就是gcc,,虽然说本质上aarch64-gcc就是gcc,但还是修改一下吧。 CC=aarch64-linux-gnu-gcc ./configure --prefix=$OPENCV_DEPEND --host=aarch64-linux --disable-assembly 加了CC,但是没用,还是gcc,算了接着往下走。如果有知道为什么的大佬麻烦请在评论区或者私信告诉下我为什么,不胜感激。 make 完成后看下文件格式 file libxvidcore.so.4.3 ibxvidcore.so.4.3: ELF 64-bit LSB shared object, ARM aarch64, make install 4.ffmpeg交叉编译 cd /home/rpdzkj/lib/ffmpeg-4.2.1 ./configure --prefix=$OPENCV_DEPEND --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=aarch64 --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=aarch64-linux-gnu-gcc --enable-swscale --extra-ldflags=-L$OPENCV_DEPEND/lib --extra-cflags=-I$OPENCV_DEPEND/include --pkg-config=PKGCONFIG --ar=aarch64-linux-gnu-ar --ranlib=aarch64-linux-gnu-ranlib make make install 4.opencv交叉编译 cd opencv-3.4.3 mkdir build cd ./build gedit toolchain.cmake ###########user defined############# set( CMAKE_SYSTEM_NAME Linux ) set( CMAKE_SYSTEM_PROCESSOR aarch64 ) set( CMAKE_C_COMPILER aarch64-linux-gnu-gcc ) set( CMAKE_CXX_COMPILER aarch64-linux-gnu-g++ ) ###########user defined############# set( CMAKE_FIND_ROOT_PATH “/usr/local/arm/opencv-depend” ) set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) ###################################### 保存文件后,执行如下命令: cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ../ 其实上述toolchain文件并不一定要写,现在的cmake-gui已经有足够多的选项完成上述工作,不过我现在没时间再交叉编译一遍了。 这里只有一个问题,交叉编译好的ffmpeg始终找不到。 上述命令执行完会有提示 openCV disables pkg-config to avoid using of host libraries. Consider using PKG_CONFIG_LIBDIR to specify target SYSROOT 1 之前一直没注意到这句提示,真的困扰了我很久,不打开pkgconfig的话ffmpeg始终找不到。 WITH_FFMPEG:判断是否引用ffmpeg,设为ON,在CmakeLists里,gui里也可以设置 HAVE_FFMPEG:判断是否有ffmpeg,这个是重点 pkgconfig设置 if(UNIX) if(NOT APPLE_FRAMEWORK OR OPENCV_ENABLE_PKG_CONFIG) if(CMAKE_CROSSCOMPILING AND NOT DEFINED ENV{PKG_CONFIG_LIBDIR} AND NOT OPENCV_ENABLE_PKG_CONFIG ) if(NOT PkgConfig_FOUND) message(STATUS "OpenCV disables pkg-config to avoid using of host libraries. Consider using PKG_CONFIG_LIBDIR to specify target SYSROOT") elseif(OPENCV_SKIP_PKG_CONFIG_WARNING) message(WARNING "pkg-config is enabled in cross-compilation mode without defining of PKG_CONFIG_LIBDIR environment variable. This may lead to misconfigured host-based dependencies.") endif() elseif(OPENCV_DISABLE_PKG_CONFIG) if(PkgConfig_FOUND) message(WARNING "OPENCV_DISABLE_PKG_CONFIG flag has no effect") endif() else() find_package(PkgConfig QUIET) endif() endif() 先尝试启动pkgconfig cmake-gui通过Add Entry按钮添加 OPENCV_ENABLE_PKG_CONFIG,选bool类型,打勾。 显示 Checking for modules 'libavcodec;libavformat;libavutil;libswscale' Found libavcodec, version 56.60.100 Found libavformat, version 56.40.101 Found libavutil, version 54.31.100 Found libswscale, version 3.1.101 Checking for module 'libavresample' No package 'libavresample' found WARNING: Can't build ffmpeg test code//重点,测试ffmpeg Video I/O: DC1394: NO FFMPEG: NO avcodec: YES (ver 56.60.100) avformat: YES (ver 56.40.101) avutil: YES (ver 54.31.100) swscale: YES (ver 3.1.101) avresample: NO GStreamer: NO libv4l/libv4l2: NO v4l/v4l2: linux/videodev2.h gPhoto2: NO 但是找到的版本号不对,并且ffmpeg始终为NO,这是因为我一开始按网上教程所说下载了ffmpeg依赖项,但是其架构是x86,而我需要aarch64的。 并且ffmpeg找到依赖项后会进行测试,就是因为测试不通过,所以ffmpeg始终为NO。 --- FFMPEG --- ocv_clear_vars(HAVE_FFMPEG) if(WITH_FFMPEG) if(WIN32 AND NOT ARM) elseif(PKG_CONFIG_FOUND) ocv_check_modules(FFMPEG libavcodec libavformat libavutil libswscale) ocv_check_modules(FFMPEG_libavresample libavresample) else() message(STATUS "Can't find ffmpeg - 'pkg-config' utility is missing") endif() endif(WITH_FFMPEG) 指定pkgconfig路径 cp -r /usr/local/arm/opencv-depend/include/ /home/rpdzkj/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/include cp -r /usr/local/arm/opencv-depend/lib/ /home/rpdzkj/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/lib export PKG_CONFIG_PATH=/home/rpdzkj/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/lib/pkgconfig/ 最后显示 Video I/O: DC1394: NO FFMPEG: YES avcodec: YES (ver 58.54.100) avformat: YES (ver 58.29.100) avutil: YES (ver 56.31.100) swscale: YES (ver 5.5.100) avresample: NO GStreamer: NO libv4l/libv4l2: NO v4l/v4l2: linux/videodev2.h gPhoto2: NO 就可以正常交叉编译opencv了,剩下的可以看网上其他教程,好久之前编译的,现在记不住细节了。 总结 这个是好久之前完成的,拖了好久才开始写博客,好多细节都忘掉了,***可能有很多错误之处,大家交叉编译时不必照抄,更多是思考着进行交叉编译。***不然很容易扎进某个错误里,白白浪费很多精力。发现了错误之处希望大家在评论区指出共同探讨。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
RK 主流平台参数对比文档:助力设计阶段快速选型(包含RK3588 RK3588S RK3588S2 RK3576 RK3568)
849 浏览 0 评论
行业集结:共同定制 RK3566 集成 AI 眼镜的前沿 AR 方案
999 浏览 0 评论
488 浏览 0 评论
457 浏览 0 评论
776 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-23 13:00 , Processed in 0.484501 second(s), Total 41, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191