在上一篇文章 鲲鹏920(ARM64)移植javacpp中,我们成功编译了javacpp的子模块ffmpeg生成了.jar文件和ffmpeg动态库。
今天我们继续编译javacpp/opencv
二. 编译OpenCV
修改opencv/cppbuild.sh 中 linux-arm64)标签下的项目。
我们是在arm64物理机上进行的编译操作,并不是交叉编译环境,所以需要修改/删除cross 交叉编译相关的参数
aarch64-linux-gnu-gcc => gcc
aarch64-linux-gnu-g++ => g++
删除 --cross-compile-prefix之类的参数。
在javacpp项目里,对于依赖的第三方项目,总是喜欢源码编译安装。那就一个一个的修改。
当然,对于不需要的模块,就没必要去编译了,比如WEBP,可以通过添加参数-DWITH_WEBP=OFF排除掉。
cpython
cd cpython
mvn install --projects cpython
./cppbuild.sh -platform linux-arm64 install cpython
numpy
numpy是opencv 必须要依赖的包.
cd numpy
mvn clean install numpy -P javacpp-platform-linux-arm64
./cppbuild.sh -platform linux-arm64 install numpy
报错:
File "/home/javacpp-presets-1.5.3/cpython/cppbuild/linux-arm64/lib/python3.7/ctypes/__init__.py", line 7, in <module>
from _ctypes import Union, Structure, Array
ModuleNotFoundError: No module named '_ctypes'
解决:
yum install libffi-devel -y
openssl
报错:
build command is : .
configuring OpenSSL version 1.1.1f (0x1010106fL) for linux-arm64
Using os-specific seed configuration
Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--config=FILE] os/compiler[:flags]
pick os/compiler from:
查看opencv/cppbuild.sh脚本,
./Configure $OS-$ARCH -fPIC no-shared
这里的$OS-$ARCH
最终是被解析成 linux-arm64, 但实际上openssl针对aarch64平台,需要的参数是 :linux-aarch64
修改为:
linux-arm64)
CFLAGS="-march=armv8-a+crypto -mcpu=cortex-a57+crypto"
cd ../$OPENSSL
./Configure linux-aarch64 -fPIC no-shared --prefix=$INSTALL_PATH/host
make -s -j $MAKEJ
make install_sw
make distclean
.
opencv
cd javacpp-presets/
./cppbuild.sh -platform linux-arm64 install opencv
错误:
JAVA: Processing OpenCV modules: 25
/tmp/ccL5CDXQ.s: Assembler messages:
/tmp/ccL5CDXQ.s:69: Error: register number out of range 0 to 15 at operand 3 -- `smull v2.4s,v0.4h,v21.h[0]'
/tmp/ccL5CDXQ.s:75: Error: register number out of range 0 to 15 at operand 3 -- `smlal v2.4s,v7.4h,v20.h[0]'
/tmp/ccL5CDXQ.s:338: Error: register number out of range 0 to 15 at operand 3 -- `smlal v1.4s,v6.4h,v18.h[0]'
/tmp/ccL5CDXQ.s:341: Error: register number out of range 0 to 15 at operand 3 -- `smlal v0.4s,v5.4h,v18.h[0]'
make[2]: *** [3rdparty/libwebp/CMakeFiles/libwebp.dir/src/dsp/yuv_neon.c.o] Error 1
make[1]: *** [3rdparty/libwebp/CMakeFiles/libwebp.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs..
…
解决:
- 升级版本到gcc-7.3及以上
- 非要使用gcc-4.8.5的话,添加参数 -march=armv8-a
-DCMAKE_CXX_FLAGS="-march=armv8-a"
错误:
Can't locate IPC/Cmd.pm in @INC
Can't locate IPC/Cmd.pm in @INC (@INC contains: /home/javacpp-presets-1.5.9/ffmpeg/cppbuild/linux-arm64/openssl-3.1.0/util/perl /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 . /home/javacpp-presets-1.5.9/ffmpeg/cppbuild/linux-arm64/openssl-3.1.0/external/perl/Text-Template-1.56/lib) at /home/javacpp-presets-1.5.9/ffmpeg/cppbuild/linux-arm64/openssl-3.1.0/util/perl/OpenSSL/config.pm line 19.
BEGIN failed--compilation aborted at /home/javacpp-presets-1.5.9/ffmpeg/cppbuild/linux-arm64/openssl-3.1.0/util/perl/OpenSSL/config.pm line 19.
Compilation failed in require at ./Configure line 23.
报错原因:缺少IPC/Cmd.pm模块
https://blog.csdn.net/sd4493091/article/details/122220902
解决:
yum -y install perl-IPC-Cmd