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。

验证:

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

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

相关推荐
思麟呀8 分钟前
网络层IP协议
linux·服务器·网络·网络协议·tcp/ip·计算机网络
执笔画流年呀10 分钟前
计算机是如何⼯作的
linux·开发语言·python
weixin_5206498711 分钟前
C#闭包知识点详解
开发语言·c#
东北甜妹16 分钟前
Redis Cluster 操作命令
java·开发语言
花间相见18 分钟前
【大模型微调与部署01】—— ms-swift-3.12入门:安装、快速上手
开发语言·ios·swift
keyipatience24 分钟前
4.5 Linux指令和权限
linux·运维·服务器
techdashen25 分钟前
Rust 正式成立 Types Team:类型系统终于有了专属团队
开发语言·后端·rust
jiayong2329 分钟前
第 17 课:任务选择与批量操作
开发语言·前端·javascript·vue.js·学习
keyipatience33 分钟前
6.linux权限
linux·运维·服务器
量子炒饭大师37 分钟前
【C++11】RAII 义体加装指南 ——【包装器 与 异常】C++11中什么是包装器?有哪些包装器?C++常见异常有哪些?(附带完整代码讲解)
开发语言·c++·c++11·异常·包装器