linux_aarch64_qt环境搭建

平台环境:

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。

验证:

如需获取各种好用的脚本,可在公众号后台留言"编译脚本"。

欢迎关注,不时分享学习过程,见证普通程序员的职业生涯。

相关推荐
天“码”行空3 分钟前
java面向对象的三大特性之一多态
java·开发语言·jvm
晚风吹人醒.16 分钟前
SSH远程管理及访问控制
linux·运维·ssh·scp·xshell·访问控制·远程管理
odoo中国1 小时前
Odoo 19 模块结构概述
开发语言·python·module·odoo·核心组件·py文件按
Uncertainty!!2 小时前
Linux多用户情况下个别用户输入密码后黑屏
linux·远程连接
necessary6532 小时前
使用Clion查看linux环境中的PG源码
linux·运维·服务器
代码N年归来仍是新手村成员2 小时前
【Java转Go】即时通信系统代码分析(一)基础Server 构建
java·开发语言·golang
Z1Jxxx2 小时前
01序列01序列
开发语言·c++·算法
沐知全栈开发2 小时前
C语言中的强制类型转换
开发语言
关于不上作者榜就原神启动那件事3 小时前
Java中大量数据Excel导入导出的实现方案
java·开发语言·excel
坚定学代码3 小时前
基于观察者模式的ISO C++信号槽实现
开发语言·c++·观察者模式·ai