交叉编译目录
‘壹’ 在 ubuntu-x86 下交叉编译 ARM-64 NCNN 记录贴
在 Ubuntux86 下交叉编译 ARM64 NCNN 的步骤如下:
配置主机环境:
- 确保已安装 Docker。
- 拉取基于 qemu 的 ARM64 镜像,选择与嵌入式板子版本相应的镜像链接。
启动 Docker 容器并挂载工作目录:
- 配置工作目录,例如 /home/ubuntu/Docker/cross。
- 启动 Docker 容器,并将工作目录挂载到容器中,以便在本地模拟 ARM64 环境进行编译。
在容器内编译 NCNN:
- 按照官网教程拉取 NCNN 代码到挂载的工作目录中。
- 在容器内更新源、安装基础包,并替换为清华镜像源以获取 ARM64 架构的依赖包。
- 开始编译 NCNN,编译过程与直接在 ARM64 板子上相同。
- 编译产物默认位于 build/install 目录下。
验证和评估性能:
- 编译完成后,可以将产物直接复制到板子上使用。
- 或在容器内部运行 NCNNBenchmark 以评估性能,注意 x86 模拟 ARM64 的性能会有较大折扣。
编译 python 封装:
- 若需要编译 NCNN 的 Python 封装,在容器中安装与板子上相同的 Python 版本。
- 编译好的 PyNCNN 库位于 build/python 目录下。
- 可以将整个 NCNN 目录复制到板子上,并使用 pip install e . 命令安装。
总结: 使用 qemu 模拟 ARM64 实现的交叉编译,无需配置本地交叉编译器等额外环境,适用于正式部署前的验证。 虽然编译效率相比直接在 ARM64 板子上低,但相比嵌入式板子的性能有显着提升。 此方案对其他库的编译依赖友好,如 QT 等复杂库的交叉编译也值得尝试。
‘贰’ FFmpeg开发笔记(八)linux交叉编译Android的FFmpeg库
在Linux环境中进行FFmpeg库的Android交叉编译,首先需要下载Linux版本的android-ndk-r21e。登录Linux服务器,例如华为云的欧拉系统,执行以下步骤:
1. 进入`/usr/local/src`目录:
cd /usr/local/src
2. 下载并解压ndk:
curl -O dl.google.com/android/r...
unzip android-ndk-r21e-linux-x86_64.zip
接下来,你需要将FFmpeg及相关库(如x264、freetype、lame)的源码上传到服务器,并进行必要的修改:
- 解压源码,替换`SYSTEM=windows-x86_64`为`SYSTEM=linux-x86_64`,并确保sh文件无回车符。
- 修改`config_x264.sh`、`config_freetype.sh`等文件,赋予可执行权限:
chmod +x config_*.sh
3. 编译x264库,修改configure文件并执行编译:
修改configure文件
./config_x264.sh
make -j4
make install
4. 对其他第三方库进行类似操作:
./config_xxx.sh
make -j4
make install
5. 配置环境变量`PKG_CONFIG_PATH`:
在.bash_profile中添加环境变量
source .bash_profile
6. 最后,编译FFmpeg库:
./config_ffmpeg_full.sh
make -j4
make install
完成后,可以在指定目录找到so文件,并将其复制到App工程的jniLibs\arm64-v8a目录,然后按照《FFmpeg开发实战:从零基础到短视频上线》的章节“12.1.3 App工程调用FFmpeg的so库”进行App的配置、编译和运行。
‘叁’ Linux 交叉编译FFmpeg库
Linux 交叉编译FFmpeg库
配置环境
在Linux上配置NDK环境和FFmpeg,首先下载并解压NDK,配置/etc/profile的环境变量,然后下载FFmpeg,解压后使用./configure --help查看帮助文档。
FFmpeg包含libavformat、libavcodec、libavutil、libswscale、libpostproc等模块,为各种音视频封装格式的生成和解析、声音/图像编解码、公共工具函数、视频场景比例缩放和色彩映射转换、后期效果处理以及工具和服务器等。
编写编译脚本
定义NDK路径,指定GCC路径,设置FLAGS结合Linux环境修改,参考externalNativeBuild/xxx/build.ninja的传参内容。学习资料推荐,免费报名学习音视频知识,资料包括C/C++、Linux、FFmpeg等。
配置参数
优化大小、不编译ffmpeg程序(命令行工具)、关闭avdevice模块、关闭所有编码器、关闭所有复用器、关闭所有滤镜、开启交叉编译、设置GCC的前缀、关闭动态库、开启静态库、传给gcc的参数等。
执行make完成编译输出
编写脚本过程中注意关闭asm、权限要求、手动创建输出文件夹、命令行格式等。
移植到Android项目中使用
创建NDK项目,将编译好的include文件夹复制到/src/main/cpp目录下,将ffmpeg lib目录下的文件复制到armeabi-v7a目录下,Cmake文件中引入库,即可愉快使用FFmpeg库。
FFmpeg是纯C的库,需要在代码中进行引用。显示ffmpeg版本号完成整个流程。
至此,Linux交叉编译FFmpeg库的流程介绍完成。
‘肆’ 如何交叉编译perl
先下载Perl源码:https://www.perl.org/get.html , 下载版本是5.10.1
下载Perl交叉编译源码补丁: https://sourceforge.net/projects/perlcross.berlios/files/, 下载版本是:perl-5.10.0-cross-0.3.tar.gz
分别解压连个文件到同一个目录下;
1
在ubuntu中安装 perlbrew:
- sudo apt-get install perlbrew
perlbrew init
source ~/perl5/perlbrew/etc/bashrc
perlbrew install perl-5.10.1 2
3
4
5
等待perlbrew安装完毕;
2
3
1
合并 两个解压出来的perl目录,进入perl-5.10.1的Cross目录中:
- cp -rfv perl-5.10.0/* perl-5.10.1/
cd perl-5.10.1/Cross 2
1
文件内容如下注意加了星号的内容:
- ### Target Arch
** ARCH = arm **
#ARCH = i386-pc
#ARCH = sh4
#ARCH = mips
#ARCH = mipsel
#ARCH = ppc
## Specific arm
**#CONFIG_TARGET_ARM_SA11X0 = 1**
#CONFIG_TARGET_ARM_XSCALE = 1
### Target OS
**OS = linux**
#OS = solaris2.8 1
修改perl的config文件
- gedit Cross/config ##或者 vi gedit Cross/config
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
上面加粗字体表示注意的或者修改的;
修改当前目录(Cross目录)中的Makefile文件:
先改变一下目录内容的权限:
chmod 777 /Cross/*修改的Makefile文件内容:
- export TOPDIR=${shell pwd}
- include $(TOPDIR)/config
- export CFLAGS
- ** export SYS=arm-linux **
- ** export CROSS=/stuff/bitbake/bin/tmp/sysroots/i686- linux/usr/armv7a/bin/arm-angstrom-linux-gnueabi- **
- ** export LD_LIBRARY=/stuff/bitbake/bin/tmp/sysroots/i686-linux/usr/lib:$(LD_LIBRARY_PATH) **
- export FULL_OPTIMIZATION = -fexpensive-optimizations -fomit-frame-pointer -O2
- export OPTIMIZATION = -O2
- export CC = arm-angstrom-linux-gnueabi-gcc
- export CXX = arm-angstrom-linux-gnueabi-g++
- export LD = arm-angstrom-linux-gnueabi-ld
- export STRIP = arm-angstrom-linux-gnueabi-strip
- export AR = arm-angstrom-linux-gnueabi-ar
- export RANLIB = arm-angstrom-linux-gnueabi-ranlib
- 12345678910111213141516
make CC=arm-angstrom-linux-gnueabi-gcc ARCH=arm patch
make CC=arm-angstrom-linux-gnueabi-gcc ARCH=arm perl
编译会出错,但是没关系,会在根目录生成perl可执行文件;