平台环境:
ubuntu 16.04:
css
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)
aarch64 gnu gcc版本:
css
gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz
Qt交叉编译版本:
css
qt-everywhere-src-5.12.9.tar.xz
一、aarch64编译器下载
armv7是ARMv7-A指令集架构的缩写,其中"A"表示"应用程序级别"。ARMv7-A架构是ARM架构的第七代,支持32位指令和地址。它是2011年前的大多数ARM芯片所采用的架构,包括Cortex-A7、Cortex-A9和Cortex-A15等。
armv8是ARMv8-A指令集架构的缩写,其中"A"表示"应用程序级别"。ARMv8-A架构是ARM架构的第八代,支持32位和64位指令和地址。它是2011年之后的ARM芯片所采用的架构,包括Cortex-A53、Cortex-A57、Cortex-A72和Cortex-A73等。
aarch64是ARMv8-A指令集架构的64位模式,也称为ARM64。它支持64位指令和地址,并提供更高的寄存器数量和更强大的指令集,因此可以更有效地处理大量数据。大多数现代的ARM芯片都支持aarch64。
需要注意的是,不同架构的ARM处理器之间并不兼容,因此编写代码时需要根据目标平台的架构进行编译。
下载地址:
https://releases.linaro.org/components/toolchain/gcc-linaro/
可以选binaries,直接是二进制文件。
x86_64 代表宿主机是64位的,其他的则都为32位的
_be 代表是大端模式,不带该字段的为小端模式
或者从ARM官网下载:https://developer.arm.com/downloads/-/gnu-a
二、使用aarch64 linux gnu编译开源库
我这开始编译的是protobuf-2.6.1,没编过...后来编译protobuf-3.6.1是ok的。
效果如下:
32位编译失败error:
protobuf有configure文件,直接用以前写好的就行。
#配置aarch64环境变量
export PATH=/opt/aarch64-linux-gnu-5.4.1/bin:$PATH
build:执行代码编译的主机,正常的话就是你的主机系统。这个参数一般由config.guess来猜就可以。当然自己指定也可以。
host:编译出来的二进制程序所执行的主机,因为绝大多数是本机编译,本机执行,所以这个值就等于build。只有交叉编译的时候(也就是本机编译,其他系统机器执行)才会build和host不同。用host指定运行主机。
bash
./configure --host=aarch64-linux-gnu \
--prefix=${libdir} \
CFLAGS="${CFLAGS} -fPIC" \
CXXFLAGS="$CXXFLAGS -fPIC" \
--enable-static=yes
如果不指定-fPIC,64位系统使用静态库时会报:
cs
"relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC"
三、Qt交叉编译环境搭建
如果你的程序用到了Qt,那么还需要交叉编译Qt。
Qt下载:https://download.qt.io/archive/qt/5.12/5.12.1/single/
解压需要一小会儿。
需要修改编译器(参考https://blog.csdn.net/u013232740/article/details/122501522):
文件路径:
./qt-everywhere-src-5.12.1/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf
默认配置文件:
ini
QMAKE_CC = arm-linux-gnueabi-gcc
QMAKE_CXX = arm-linux-gnueabi-g++
QMAKE_LINK = arm-linux-gnueabi-g++
QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++
QMAKE_AR = arm-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabi-objcopy
QMAKE_NM = arm-linux-gnueabi-nm -P
QMAKE_STRIP = arm-linux-gnueabi-strip
修改后为:
有configure文件:
sql
./configure -recheck-all -release -extprefix qt-5.12.9-arm-64
-xplatform linux-aarch64-gnu-g++ -no-opengl -no-openssl
-nomake tests -no-compile-examples -nomake examples
-gif -ico -qt-libpng -qt-libjpeg -qt-sqlite
注意xplatform。我用这个编译成功了。
编译OK,可以给Qt再添加一个编译器。或者对Qt的pro文件直接使用qmake进行编译。
四、Qt交叉编译环境搭建
直接整不行,需要设置环境变量。
source ./env.sh
一睹.qmake.stash内容:
有了Makefile自然可以make -j8.
虽然我写的是make -j8,但我用的是make -j16。
验证:
如需获取各种好用的脚本,可在公众号后台留言"编译脚本"。
欢迎关注,不时分享学习过程,见证普通程序员的职业生涯。