交叉编译成LoongArch(Makefile,CMake,AutoTool,Qt等方式)

news2024/11/16 13:03:18

在嵌入板卡中由于资源有限常常使用像busybox这样的轻量文件系统。由于这类轻量文件系统没有编译系统在里面,所以如果需要软件在板卡上运行,那么交叉编译是必不可少的。

如果对交叉编译(cross compile)这个概念不太清楚的话,可以参考以下的一个说法。交叉编译通常指的是在PC机(x86架构)上使用交叉编译工具链(通常是编译内核的那个工具链),完成软件的编译,编译出一个可执行程序,此程序是在对应CPU的架构上才能运行。这种情况叫做交叉编译,例如在x86 架构的电脑上通过交叉编译工具链可以编译出在LoongArch架构上运行的程序。

对于龙芯嵌入式系列板卡,则采用以下方式进行交叉编译:在X86机器的ubuntu18.04的系统中,使用交叉编译工具链,编译软件,然后复制编译出来的可执行文件到板卡中(USB传输等手段),然后才能在板卡上运行。

需要注意的是,交叉编译出来的软件,不仅仅可以给busybox用,loongnix系统也能用。因为编译出来的可执行程序是适应对应架构的。

下文将会介绍软件的交叉编译方式,其中包括一般软件和Qt软件。

一般软件,本处的定义通常指代为没有使用特殊IDE进行编译的软件。下面将会介绍,手动编译使用makefile编译使用Cmake编译对于autotools-package方式的源码编译(有configure文件那种)

由于此章节适用于多数嵌入式板卡,但是编译和cpu的架构相关,所以会有所差别,下文中的编译演示将会以loongarch来说明

不同的架构,只是采用的交叉编译工具链不同,然后导致声明交叉编译工具链的命令不同。(下面的演示不包含工具链的部署)

下面的演示中,声明交叉编译工具链的命令是3条export语句。

例如:对于loongarch64(即64位loongarch架构)目前用的交叉编译工具链是toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18.tar.gz

命令如下:


export PATH=$PATH:/opt/toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18/bin/

export ARCH=loongarch64

export CROSS_COMPILE=loongarch64-linux-gnu-

工具链可根据实际情况而定,声明工具链的PATH那个命令,路径是去到工具链里面的bin目录即可。

1. 手动编译软件

以一段简单的代码用以说明,代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4FTR9y8i-1685539170410)(…/common/./photo/filesystem/compile/compile-handmake-1.png)]在这里插入图片描述
然后声明工具链,即在shell终端输入以下命令:(这个只是例子,按实际情况而定)


export PATH=$PATH:/opt/toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18/bin/

export ARCH=loongarch64

export CROSS_COMPILE=loongarch64-linux-gnu-

在这里插入图片描述

随后输入以下命令进行编译:(这个只是例子,按实际情况而定)。


loongarch64-linux-gnu-gcc main.c -o main

在这里插入图片描述
在这里插入图片描述

通过file命令查看编译后的main 文件,显示“ unknown arch 0x102 ”,这是因为LoongArch的二进制编号为258(0x102),较新的file 命令才添加了对LoongArch的支持。

然后就可以复制main这个可执行程序到板卡(USB传输等方式,视情况而定),然后就能运行这个程序。

2. 使用Makefile编译软件

本处不再赘述Makefile的相关概念。

下面将会使用龙芯测试软件的一个例子来说明。
在这里插入图片描述

上图是软件的代码结构展示图。main.c调用uart_test模块,uart_test调用uart模块。
下面将会提供一个Makefile文件的例子:

CC=gcc
FLAGS=-g -Wall -std=gnu11

INC=-I./
LIB=

SRC=$(wildcard *.c )
OBJS=$(patsubst %c,%o, $(SRC))

TARGET=uart_test

all:$(TARGET)
$(TARGET):$(OBJS)
	@echo "makeing target"
	@echo $(SRC)
	@echo $(OBJS)
	$(CC) ${FLAGS} -o $@ $? $(LIB)

%.o:%.c
	$(CC) ${FLAGS} -c $< -o $@ $(INC)

.PHONY:clean
clean:
	-rm $(OBJS) $(TARGET)

请注意,由于makefile对缩进的格式很严谨,上述的内容只是作为例子,如果直接使用,还需根据实际情况,手动调整格式。见下图,需要使用tab进行缩进。

在这里插入图片描述

在makefile文件所在的文件夹打开终端。

然后声明工具链,即在shell终端输入以下命令:(这个只是例子,按实际情况而定)


export PATH=$PATH:/opt/toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18/bin/

export ARCH=loongarch64

export CROSS_COMPILE=loongarch64-linux-gnu-

在这里插入图片描述

需要注意的是,如果直接make,按照Makfile文件里面的CC=gcc,那么生成的程序就是编译的机器上能运行的,见下图:

在这里插入图片描述

可以修改CC的值为对应交叉编译工具链gcc的名字。

源码可以在有编译条件下的系统上可以编译,比如loongnix上面有gcc,那么就能编译。

交叉编译的时候,建议make命令为:


make CC=loongarch64-linux-gnu-gcc

在这里插入图片描述

同样地,复制可执行程序到板卡上运行即可。

3. 使用CMake编译

关于CMake的构建不再赘述。本处只说明cmake命令运行时如何指定交叉编译工具链。

下面将会以龙芯测试软件的cmake构建来作为例子说明。

声明工具链,即在shell终端输入以下命令:(这个只是例子,按实际情况而定)


export PATH=$PATH:/opt/toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18/bin/

export ARCH=loongarch64

export CROSS_COMPILE=loongarch64-linux-gnu-

在这里插入图片描述

预期的构建方式是CMakeLists.txt文件在源码根目录,需要创建一个build文件夹,然后在build文件夹中使用命令:


cmake …/

即可完成Cmake部署,然后make进行构建。

注意上述只是一个例子,构建过程需要按照实际情况调整。

如同上述的Makefile那样,没有指定对应的gcc,那么是以编译的机器的架构来编译的。
在这里插入图片描述
如果cmake的时候不小心没指定gcc,那么建议清空相关文件(按照本例子,则删除build文件夹),重新操作。

那么如果要指定gcc和g++,可以参考下面的命令:


cmake -DCMAKE_C_COMPILER=loongarch64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=loongarch64-linux-gnu-g++ …/

在这里插入图片描述

随后make的话就是用指定的gcc编译。

当然上述的指定gcc的方式只是其中一种,更多的方式可以根据Cmake的特性进行修改(比如修改CMakeLists.txt文件)。

4. 使用autotools-package编译(./configure)

对于使用configure文件来检查编译环境的源码,如果是本地编译,那么只需要./configure,make, make install即可。但是在交叉编译的时候,是需要指定交叉编译工具链的。

下面将以编译coreutils-8.32为例子说明。

输入./configiure --help的时候会发现CC这个属性,这个就是gcc的值。理论上只要声明工具链,然后执行configure时指定参数CC=loongarch64-linux-gnu-gcc的话,就能指定工具链。
在这里插入图片描述

但是会发现报以下的错误:
在这里插入图片描述

所以建议的操作如下:

声明工具链,即在shell终端输入以下命令:(这个只是例子,按实际情况而定)


export PATH=$PATH:/opt/toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18/bin/

export ARCH=loongarch64

export CROSS_COMPILE=loongarch64-linux-gnu-

在这里插入图片描述
输入命令:

./configure --host=loongarch64 CC=loongarch64-linux-gnu-gcc

而对于loongarch架构,因为这是新的架构,目前ubuntu18.04里面是没有这个架构的记录的。进而报这个错误。
在这里插入图片描述
这是在build-aux/config.sub脚本里面没有loongarch64的记录。而在系统的/usr/share/misc文件夹下面,有以下的文件。
在这里插入图片描述
那么建议切换到root用户下(su root),在/usr/share/misc的文件夹下对config.guess和config.sub文件进行添加(建议事先备份)或者下载最新的config.guess和config.sub 文件。下载方法:

下载config.sub


sudo wget -O /usr/share/misc/config.sub “git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD”

下载config.guess


sudo wget -O /usr/share/misc/config.guess “git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD”

如手动修改config.guess或config.sub则添加内容如下:

config.guess文件的964行附近,添加

loongarch32:Linux:\*:\* | loongarch64:Linux:\*:\* | loongarch:linux:\*:\*)
		echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
		exit ;;

如下图:
在这里插入图片描述

在config.sub文件的295行附近,添加:

| loongarch32 | loongarch64 | loongarch \

如下图:
在这里插入图片描述

可见添加内容都是仿照其他架构的内容。添加的位置不是指定的。只需要模仿得当即可。

然后在build-aux里面执行以下命令(注意不是root用户):


cp /usr/share/misc/config.guess /usr/share/misc/config.sub ./

在这里插入图片描述
然后configure就能成功执行。
在这里插入图片描述
在这里插入图片描述
随后只需要make即可编译完成。


注意交叉编译的产物不是编译机能用的程序,所以make install的话,就会把不属于编译机的程序安装到编译机的/usr中。那么将会是比较麻烦的事情。

所以请提前准备好安装的目录,并且在configure的参数中声明或者make install的时候指定安装路径。通常–prefix指的是安装路径。建议在configure的时候指定好。
在这里插入图片描述

其他更加精细的安装目录设置则根据实际情况与configure的特性而自行指定。

对于其他源码包,可能关于config.guess的报错不只一处,还请按照实际情况做出对应操作。

5. Qt交叉编译软件

注意本文演示的系统是ubuntu18.04系统,如果是开发板资料中提供的软件包,那么不需要管Qt的部署,因为已经设置好了,直接前往编译就好。

首先,ubuntu18.04需要安装好Qt环境和QtCreator。开发板资料中有一个qt-opensource-linux-x64-5.12.11.run包,可以在ubuntu18.04里面直接运行,即可安装上述的两个条件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
随后根据安装提示安装即可。

注意上面只是推荐了一种开发方式。即Qt的UI界面和一些逻辑处理可以在ubuntu18.04里面验证,然后再使用交叉编译,到板卡上运行验证。

下面分以下步骤说明:部署loongarch64版本的Qt套件,部署Qtcreator的交叉编译配置。选择编译配置。

先部署loongarch64版本的Qt套件,在开发板资料中有Qt-5.15.2-LA64.tar.gz的压缩包。请复制到ubuntu18.04的里面(路径不做要求)。然后在压缩包所在的文件夹中打开终端,输入:


sudo tar -zxf Qt-5.15.2-LA64.tar.gz -C /usr/local

那么/usr/local/下就会存在文件夹Qt-5.15.2-LA64。那么部署成功。

然后就是Qtcreator的部署。例子如下:

打开Qtcreator,按下面的图示操作执行。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
然后就能获得下图所示的内容:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

那么Qtcreator的部署就完成了。

如何选择编译配置,如果你是新建工程那么可以参考下图:
在这里插入图片描述
在这里插入图片描述

然后照常编译(点击绿色那个三角形)。
在这里插入图片描述

只需要到对应的阐述文件夹里面找到可执行程序文件,传输到板卡上执行即可。
在这里插入图片描述
在这里插入图片描述
**如果是移植旧项目的情况,需要选择这个编译配置的话 **。按照下图操作:
在这里插入图片描述
在这里插入图片描述

之后的操作与前文一致。

如果设置了Qtcreator之后,Qtcreator编辑的时候,代码无法高亮,可以参考以下的解决方式
在这里插入图片描述
在这里插入图片描述

5.1 Qt和tslib使用建议

如果使用tslib作为触控屏的使用库,比如ls2k500先锋板中就是使用tslib库作为Qt的触摸处理库。

关于Qt和tslib的的使用,目前推荐的tslib声明为

export QT_QPA_FB_TSLIB=1
./driver_testcase

或者

export QT_QPA_FB_TSLIB=1 && ./driver_testcase

在启动的时候,由于使用tslib作为触摸屏的Qt库,所以需要运行Qt程序之前执行export QT_QPA_FB_TSLIB=1的命令
。如果不声明该环境变量,那么启动后,触摸可以让鼠标移动,但是会出现不能点击按钮的bug。

**并且为了更加方便,可以不用输入export QT_QPA_FB_TSLIB=1,资料包中的文件系统已经把export QT_QPA_FB_TSLIB=1写入/etc/profile里面,只需要直接运行Qt程序即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

加盐算法:手撕+Spring Security、提高密码安全性的必杀技

目录 一、概念和理解 &#xff08;一&#xff09;MD5加密 &#xff08;二&#xff09;加密解密过程 &#xff08;三&#xff09;加盐 1.什么是盐值&#xff1f; 2.如何加盐? 二、手写加盐算法 &#xff08;一&#xff09;密码工具类 &#xff08;二&#xff09;项目改动 注册 …

Spring Boot如何实现自定义Spring Boot启动器

Spring Boot如何实现自定义Spring Boot启动器 在Spring Boot中&#xff0c;启动器&#xff08;Starter&#xff09;是一组依赖项的集合&#xff0c;它们一起提供了某个特定的功能。使用Spring Boot启动器可以让我们更加方便地集成第三方库和框架&#xff0c;并且可以避免版本冲…

2023年京东618预售数据重磅出炉!(大家电篇:预售额550亿)

2023年5月23日至5月31日&#xff0c;京东618预售期正式落幕。今年的预售&#xff0c;不少行业及品牌首战告捷&#xff0c;拿下了不错的成绩。 数据统计时间&#xff1a;5月23日至5月30日 平台&#xff1a;京东 今晚&#xff0c;鲸参谋率先来盘点一下大家电行业在23日至30日预售…

知名大厂的UI组件库有哪些?

以下是 5 款优秀的 UI 设计组件库的推荐&#xff0c;这些组件库都可以免费获取&#xff0c;帮助你解答疑惑&#xff0c;提供设计参考&#xff0c;并提高工作效率 1、MUI&#xff08;Material-UI&#xff09; 包含 60 类别的 UI 设计组件&#xff0c;可在即时设计资源广场一…

开源!AREX接口自动化回归测试的全过程

AREX是一款开源的基于真实请求与数据的自动化回归测试平台&#xff08;项目地址&#xff1a;https://github.com/arextest&#xff09;&#xff0c;利用JavaAgent技术与比对技术&#xff0c;通过流量录制回放能力实现快速有效的回归测试。同时提供了接口测试、接口比对测试等丰…

Sentinel 介绍及整合OPenFeign及GateWay

Sentinel 介绍 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景&#xff1a; Sentinel 承接了阿里巴巴近…

IDEA 插件上新! 生成接口文档就是这么快!

当有接口对接需求的时候&#xff0c;开发终于不用再担心 API 文档难写了&#xff0c;也不用再一个个接口文档重新写&#xff01;安装这个 IDEA 插件&#xff0c;可以一步将文档导入到 Postcat。 这款插件操作简单&#xff0c;容易上手&#xff0c;能够让开发者省去API文档编写的…

STM32G0x0系列-软件定时器解决HAL_Delay问题

目录 HAL_Delay函数源码 软件定时器 创建工程试验 1.将对应文件移动到项目位置 2.添加现有文件放到工程中 3.重定向printf 3.验证自己的软件定时器 4.查看现象 HAL_Delay函数使用了中断机制来实现延时功能&#xff0c;当在中断函数中调用HAL_Delay函数需要考虑中断优先…

《操作系统》by李治军 | 实验5.pre - copy_process 代码详解

目录 【前言】 代码分析 1. 申请子进程 PCB 空间 2. 找到子进程的内核栈 3. 父子进程共用同一内存、堆栈和数据代码块 4. 相关寄存器入栈 5. switch_to 返回位置 6. 响应 switch_to 的弹栈工作 7. 更新子进程 PCB 8. 子进程切换流程 【前言】 在李治军老师的《操作系…

MyBatis——缓存

是一种临时存储少量数据至内存或者是磁盘的一种技术.减少数据的加载次数,可以降低工作量,提高程序响应速度 缓存的重要性是不言而喻的。mybatis的缓存将相同查询条件的SQL语句执行一遍后所得到的结果存在内存或者某种缓存介质当中&#xff0c;当下次遇到一模一样的查询SQL时候…

Yolov8涨点神器:ODConv+ConvNeXt提升小目标检测能力

1.涨点神器结合,助力YOLO 1.1 ICLR 2022涨点神器——即插即用的动态卷积ODConv 论文:Omni-Dimensional Dynamic Convolution 论文地址:Omni-Dimensional Dynamic Convolution | OpenReview ODConv通过并行策略引入一种多维注意力机制以对卷积核空间的四个维度学习更灵活的…

项目所需的Python版本+国内源+虚拟环境+用Conda创建环境

文章目录 &#xff08;一&#xff09;Python&#xff08;1.1&#xff09;国内源&#xff08;1.2&#xff09;设置源&#xff08;全局&#xff09;&#xff08;1.3&#xff09;使用源&#xff08;单次&#xff09; &#xff08;二&#xff09;Python环境&#xff08;2.1&#xf…

【数据结构与算法】力扣:栈和队列(一)

1 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队列开…

vue diff算法与虚拟dom知识整理(13) 手写patch子节点更新换位策略

上一文中我们编写了 patch中新旧节点都有子节点的 插入节点的逻辑 但旧节点的子节点发生顺序 或数量变化 我们还没有处理 那我们现在继续 我们先来看看 原本是怎么写的 我们打开我们的案例 找到 node_modules 下面的snabbdom/src下面的 init.ts文件 我们在里面找到一个 updat…

Openai+Deeplearning.AI: ChatGPT Prompt Engineering(六)

想和大家分享一下最近学习的Deeplearning.AI和openai联合打造ChatGPT Prompt Engineering在线课程.以下是我写的关于该课程的前五篇博客&#xff1a; ChatGPT Prompt Engineering(一)ChatGPT Prompt Engineering(二)ChatGPT Prompt Engineering(三)ChatGPT Prompt Engineering…

QML Text 元素

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在 QML 中,Text 和 Label 是两种常用的元素(Label 继承于 Text),用于显示文本内容。虽然它们看起来很相似,但在使用和功能上有一些不同。 对于 Text 元素,比较重要的是 text 与 font 属性,一旦指定了…

Linux常见IO模型-3

在前两篇博客中&#xff0c;我们讲述了常见的IO模型&#xff0c;并对多路转接模型中的select模型进行了细致介绍和具体的代码实现。那么接下来&#xff0c;我们在本篇博客中将对剩余的多路转接模型中的&#xff1a;poll和epoll进行介绍。 目录 1.poll 1.1操作流程 1.2代码实…

硬件系统工程师宝典(27)-----MOSFET、BJT搭配,干活不累

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到场效应管的原理是通过“监测”栅极和源极间电压来实现控制漏极-源极之间电流的目的。今天我们来讲讲场效应管如何和BJT搭配设计控制电路…

【P44】JMeter 模块控制器(Module Controller)

文章目录 一、模块控制器&#xff08;Module Controller&#xff09;参数说明二、测试计划设计 一、模块控制器&#xff08;Module Controller&#xff09;参数说明 提供了一种在运行时将测试计划片段替换为当前测试计划的机制&#xff1b;模块控制器的目标是为增加脚本的复用…