RK3568源码编译与交叉编译环境搭建

news2024/11/19 13:36:56

本篇进行飞凌OK3568-C开发板的Linux系统开发需要用的软件交叉编译环境的配置。

对于软件开发,如果只是使用C/C++代码,则在自己的Ubuntu虚拟机中添加RK3568对应的交叉编译器(gcc/g++)即可,如果要进行Qt开发,则还要再交叉编译与RK3568配套的Qt源码,一种解决方法是直接编译RK3568的源码,编译完成之后,会包含有Qt的编译结果,使用RK3568源码编译的成果物,就可用进行Qt开发了。下面就介绍这两种交叉编译环境的配置方法。

1 C/C++交叉编译环境配置

如果只是使用C/C++代码,进行代码的交叉编译时可用使用如下方法,该配置方式简单便捷。

1.1 下载aarch64类型的gcc

在Linaro 官网中下载GCC 交叉编译工具链,RK3568为Cortex-A55内核64位的开发板,需要使用aarch64-linux-gnu。

地址:https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/

我下载的是这个:gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz。

然后解压:

tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar 

解压结果如下:

解压完成之后,可以在其下的bin目录中看到aarch64编译器:

使用这里的gcc或g++,就能交叉编译C或C++程序了。

1.2 交叉编译C/C++程序测试

写一个helloword的c++测试程序main.cpp:

#include <stdio.h>

int main()
{
	printf("hello\n");

	return 0;
}

然后使用如下指令进行编译:

export PATH=/home/xxpcb/myTest/OK3568/gcc_aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
aarch64-linux-gnu-g++ main.cpp -o main

第一句是临时添加环境变量,当然也可以添加到.bashrc中实现永久添加,由于每种板子用到的编译工具链不太一样,我一般都使用这种临时添加的方式。

第二句是使用aarch64-linux-gnu-g++来编译C++程序,编译结果如下,可用使用file指令查看编译出的程序的文件类型:

可以看到,编译出的文件是ELF 64-bit LSB的可执行文件,ARM aarch64架构的。

然后将程序放到OK3568板子中运行,这里使用ADB拷贝程序。

可以看到上面右图中在OK3568板子中成功运行了hello word程序。

1.3 关于板子的WIFI自动配网

给板子传输文件时,需要先连上网络,上篇介绍过,OK3568板子使用一个脚本来进行WIFI配网,但每次开机后都需要再配置。可以写个脚本加入到开机自启动程序中。

例如,在/etc/init.d目录下,添加一个S99myinit文件,写入如下内容即可实现开机自动连网:

#!/bin/sh

fltest_wifi.sh -i mlan0 -s "wifi_name" -p wifi_password

注意要替换为自己的WIFI名和密码,并且要给这个文件可执行权限。

2 RK3568 Linux源码编译

刚才介绍了只进行C/C++程序开发时进行交叉编译环境配置的方法。

如何还要进行Qt开发,可以通过编译RK3568 Linux源码的方式,得到Qt的交叉编译工具链。

飞凌开发手册中建议使用资料中提供的虚拟机环境进行源码编译,由于我这里已经安装过了VirtualBox虚拟机和Ubuntu18系统,那就在自己的开发环境中进行RK3568的开发吧。

2.1 基础环境配置

在进行RK3568的源码编译之前,需要先进行对自己的虚拟机进行一些依赖包的安装,如下。

首先是安装一些必要的库:

sudo apt-get update 
sudo apt-get install build-essential 
sudo apt-get install libncurses*    
sudo apt-get install lzop 
sudo apt-get install net-tools  

然后还有安装一些编译OK3568 Linux源码所需的库

sudo apt-get update
sudo apt-get install openssh-server vim git fakeroot
sudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool expect g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib unzip device-tree-compiler python-pip libncurses5-dev

此外,为了便于Qt开发,可选择安装Linux版的Qt Creator到自己的虚拟机中,安装过程也比较简单,并且我之前已经安装过了,这里就不过多介绍了。当然,不安装Qt Creator也是可以进行Qt程序的编译的,只要有Qt交叉编译环境即可。

2.2 准备RK3568源码

K3568源码在飞凌提供的板子资料中。

在这里插入图片描述

复制RK3568源码到Ubuntu虚拟机中,准备编译:

cat OK3568-linux-source.tar.bz2.a* > OK3568-linux-source.tar.bz2
tar -xvf OK3568-linux-source.tar.bz2 

第一句是把.aa和.ab两个压缩包合并为一个压缩包,有个两个文件都差不多4G大小,这个合并的过程需要一点时间(大概2、3分钟左右),并且合并过程没有信息打印,命令行为不可输入状态,等变为可输入状态,即合并完成,并且在虚拟机上可看到合并后的压缩包。

第二句是把合并后的压缩包进行解压,这个解压过程也要一点时间(大概20分钟左右),解压过程会有信息打印。

解压完成后,可以看到OK3568-Linux的源码文件夹:

2.3 编译RK3568源码

在编译之前,需要确保自己的虚拟机有足够的磁盘空间和内存空间,我的虚拟机配置如下,我的笔记本一共12G内存,我给了虚拟机10G。

注意上图中的硬盘空间,只是这个虚拟机的最大空间,需要在ubuntu中使用df指令确认下实际的大小,如果不够大,可以使用GParted等软件调整自己的虚拟机硬盘空间。

如下图所示,我的ubuntu的硬盘现在总共是276G,这个截图是我编译完源码后截的图,感觉整个编译源码操作,耗费了有几十个G的空间,现在还剩余80G的空间可用。

2.3.1全编译测试

进入到刚才解压后的RK3568源码目录,通过运行.build.sh脚本即可编译,在编译之前,可以先来看下脚本中的内容:

这边编译脚本比较长,截取部分图如下:

执行脚本后,会先先出现一个选项需要选择,如图,选择1,即使用ok3568的配置。

编译一段时间后(大概10分钟)会弹出下图界面,需要选择,提取图中信息

  • VCCIO4 和 VCCIO6 选择 1800000

  • 其余的选择 3300000,

使用上下方向按键选择选项,按回车确认选择即可。

编译的过程中,会十分耗费内存资源,我的电脑显示在编译过程中,内存基本占满了,再使用其它软件都会特别的卡,所以在编译的时候,就不用进行其它操作了,让它独自编译好了。

整个编译时间较长,我的电脑用了7、8个小时才编译完,从凌晨编译到天亮,还好没报错。编译成功后的截图如下,注意大片的红色部分不是错误信息,只是在提醒电源域的配置是否正确。

编译成功后,会在IMAGE文件夹下生成对应编译工程结果文件,这些文件中,update.img为打包好用于OTG或TF卡全烧写使用,其它的编译文件用于分步烧写时使用。

我编译RK3568源码,只是为了得到Qt的交叉编译环境,就先不进行镜像的烧写了,因为板子中默认已经烧写好了,以后有时间再研究固件的烧写,目前打算先进行Qt程序的开发。

2.3.2 内核单独编译测试

整个编译程序,十分的耗时,有时如果只是修改了内核代码,可以单独编译内核,编译方法是,在执行脚本时,指定一个kernel参数即可

./build.sh kernel

3 Qt程序交叉编译测试

3.1 Qt程序交叉编译

RK3568 Linux源码编译完成后,可以到output目录下的bin目录中查看编译出的交叉编译工具,对应Qt开发,需要注意是qmake这个工具,bin目录中的所有编译工具如下:

使用资料中的Qt程序进行交叉编译测试,我使用的是qcamera这里例程,将程序源码复制到Ubuntu中,然后使用如下指令进行Qt程序的交叉编译:

export PATH=/home/xxpcb/myTest/OK3568/sourcecode/OK3568-linux-source/buildroot/output/OK3568/host/bin:$PATH
/home/xxpcb/myTest/OK3568/sourcecode/OK3568-linux-source/buildroot/output/OK3568/host/bin/qmake
make

第一句是临时添加环境变量

第二句是使用RK3568源码编译结果中的qmak来生成Makefile

第三句是使用make来编译

编译结果如下,同样可以使用fie指令来确认编译出的可执行文件的文件类型。

可以看到,编译出的fltest_qt_qcamera文件也是ELF 64-bit LSB的可执行文件,ARM aarch64架构的。

3.2 Qt程序在板子中运行测试

同样使用ADB的方式,将可执行程序拷贝到板子中,然后运行,运行结果如下,注意我在qt程序中稍微修改了一下,给Exit字符串加了一个中括号,以确认板子中运行的就是我自己编译出的Qt程序。

至此,Qt的交叉编译环境已验证可正常使用。

4 总结

本篇进行了飞凌OK3568-C板子的软件开发环境的搭建,主要是交叉编译工具链的搭建,并且介绍了仅使用C/C++开发和使用Qt开发时两种交叉编译环境配置方式,前者下载一个编译工具即可,后者需要将RK3568 Linux的源码进行整个编译,来获取Qt的交叉编译工具。

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

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

相关文章

UDS诊断系列介绍09-1485服务

本文框架1. 系列介绍1.1 14服务概述1.2 85服务概述2. 14服务请求与应答2.1 14服务请求2.2 14服务正响应3. 85服务请求与应答3.1 85服务请求3.2 85服务正响应3.3 否定应答4. Autosar系列文章快速链接1. 系列介绍 UDS&#xff08;Unified Diagnostic Services&#xff09;协议&a…

graalvm+spring-cloud-gateway打造又快又小的类nginx本地网关

前言 网关是微服务架构的入口&#xff0c;外网请求通过网关转发到独立的微服务。项目一般会经过多个环境的测试&#xff0c;最终发布到生产。一个http请求&#xff0c;如&#xff1a;http://public_host/api/v1/some_service/some_path?ab&cd会先经过公网域名&#xff0c…

ThinkPHP5.x未开启强制路由(s参数)RCE

官方公告&#xff1a;https://blog.thinkphp.cn/869075 由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞&#xff0c;受影响的版本包括5.0和5.1版本 ThinkPHP5基础 环境搭建 官网直接下载完整包 https://www.thinkphp.cn/down/870.…

ElasticSearch集群架构及底层原理

前言ElasticSearch考虑到大数据量的情况&#xff0c;集群有很多的部署模式&#xff0c;本篇不会具体进行演示了&#xff0c;只是说明一下有哪些架构可以选&#xff0c;及一些原理的简单介绍&#xff0c;如果要看具体操作的那么可以自行进行搜索&#xff0c;这不是本篇博客要介绍…

OCR文字识别软件哪个好?7大文字识别软件

由于从各种文档中提取文本的需求非常普遍&#xff0c;许多办公软件或公司都提供了OCR工具。在本文中&#xff0c;我们为您推出了一系列功能强大且易于使用的最佳 OCR 软件。 什么是 OCR 软件&#xff1f; OCR 软件是一种程序或工具&#xff0c;可以使用光学字符识别技术识别数…

小红书数据分析网站:揭晓普通博主1个月涨粉百万的密码!

导语&#xff1a; 随着2023年的来临&#xff0c;回首小红书动态&#xff0c;行业热度依旧高涨&#xff0c;越来越多的达人涌入小红书。在时尚领域&#xff0c;更是出现了如氧化菊这样的大势变装博主&#xff01;短短一周涨粉13W的变装博主为何能突围&#xff0c;强势吸睛呢&am…

[LCTF]bestphp2022安洵杯 babyphp

目录 <1> [LCTF]bestphp‘s revenge SoapClient触发反序列化导致ssrf serialize_hander处理session方式不同导致session注入 crlf漏洞 <2> 安洵杯 babyphp SoapClient 触发ssrf session反序列化 利用文件操作原生类读取flag <3> XCTF Final Web1 解…

Spring Security 解析(六) —— 基于JWT的单点登陆(SSO)开发及原理解析

Spring Security 解析(六) —— 基于JWT的单点登陆(SSO)开发及原理解析 在学习Spring Cloud 时&#xff0c;遇到了授权服务oauth 相关内容时&#xff0c;总是一知半解&#xff0c;因此决定先把Spring Security 、Spring Security Oauth2 等权限、认证相关的内容、原理及设计学习…

[极客大挑战 2019]Secret File

目录 信息收集 解题思路 信息收集 先看源码&#xff0c;发现一个php文件 <a id"master" href"./Archive_room.php" style"background-color:#000000;height:70px;width:200px;color:black;left:44%;cursor:default;">Oh! You found me&…

9.2 容器库概览

文章目录所有容器的共性&#xff1a;迭代器迭代器的范围容器类型成员begin和end成员容器的定义和初始化与顺序容器大小相关的构造函数赋值和swapassignedswap容器大小操作关系运算符所有容器的共性&#xff1a; 表格一&#xff1a; 类型别名说明iterator迭代器const_iterator…

用R语言理解全微分

文章目录6 全微分梯度的概念全微分前情提要 R语言微积分极限π,e,γ\pi, e, \gammaπ,e,γ洛必达法则连续性和导数数值导数差商与牛顿插值方向导数 6 全微分 梯度的概念 对于任意函数f(x0,x1,⋯,xn)f(x_0,x_1,\cdots,x_n)f(x0​,x1​,⋯,xn​)&#xff0c;其梯度为 ∇f(∂f∂…

解决从BIOS选择从U盘启动但是系统仍然从硬盘启动的问题

我怀疑是BIOS失去了记忆能力&#xff0c;不能记住我的选择&#xff0c;所以仍然按默认从硬盘启动。 解决&#xff1a;重置BIOS即可 下面用物理方法重置BIOS。 在主板上找到这三根针&#xff0c;将上面的黑色套子拔出&#xff0c;然后插入旁边的另外两根针&#xff0c;例如开始…

基于python知识图谱医疗领域问答系统实现

直接上结果展示: “让人类永远保持理智,确实是一种奢求” ,机器人莫斯,《流浪地球》 项目概况 本项目为一个使用深度学习方法解析问题,知识图谱存储、查询知识点,基于医疗垂直领域的对话系统的后台程序 运行效果:

aws beanstalk 结合packer创建自定义平台

参考资料 https://github.com/aws-samples/eb-custom-platforms-samples#updating-packer-templateElastic Beanstalk 自定义平台 今天使用eb平台创建环境的时候&#xff0c;发现有名为packer的选项&#xff0c;查询文档发现aws beanstalk支持自定义平台&#xff0c;这功能几…

4. 使用预训练的PyTorch网络进行图像分类

4. 使用预训练的PyTorch网络进行图像分类 这篇博客将介绍如何使用PyTorch预先训练的网络执行图像分类。利用这些网络只需几行代码就可以准确地对1000个常见对象类别进行分类。这些图像分类网络是开创性的、最先进的图像分类网络&#xff0c;包括VGG16、VGG19、Inception、Dens…

windows下 pytorch的安装(gpu版本以及cpu版本)

一. 查看是否有gpu 打开cmd 输入nvidia-smi 是以下这种情况的就是有gpu 没有gpu的话就会报错 下载安装cuda以及cudnn&#xff08;安装cpu版本可以跳过此步骤直接进行pytorch的安装&#xff09; 下载cuda 看清楚两个箭头指的地方 一个是11.3.0 一个是日期 后面下载cudnn的时…

ProEssentials Pro 9.8.0.32 Crack

ProEssentials .Net图表组件用于对您的科学、工程和金融图表进行评估和选择&#xff01; Winforms 图表, WPF 图表, C/MFC/VCL 图表. Gigasoft拥有20多年帮助企业开发大型客户端和嵌入式图表项目的经验 为何选择ProEssentials&#xff1f; 我们真诚地希望您能针对您的具体实施…

day03 链表 | 203、移除链表元素 707、设计链表 206、反转链表

题目 203、移除链表元素 删除链表中等于给定值 val 的所有节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#xff1a;head [], val 1 输出&#xff1a;[] 示例 3&#xff1a; 输入&am…

Pytorch Kaggle实战:House Prices - Advanced Regression Techniques

通过Kaggle比赛&#xff0c;将所学知识付诸实践 目录 1、下载和缓存数据集 2、访问和读取数据集 3、数据预处理 3、训练 4、K折交叉验证 5、模型选择 6、提交Kaggle预测 1、下载和缓存数据集 建立字典DATA_HUB,它可以将数据集名称的字符串映射到数据集相关的二元组上&am…

网络抓包-抓包工具tcpdump的使用与数据分析

1.测试背景 本次测试选用两台不同的服务器&#xff0c;ip分别为.233和.246,233服务器为客户端&#xff0c;246服务器为服务端。利用tcp协议就行socket通信。socket网络编程部分示例代码为基本的通信代码&#xff0c;需要了解tcp网络通讯的基本协议与过程。服务器上采用tcpdump…