Yocto学习笔记1-下载与首次编译

Yocto学习笔记1-下载与首次编译

  • 1、基础环境介绍
  • 2、注意点
  • 3、安装依赖
    • 3.1 yocto常规系统构建所需依赖库(较全)
    • 3.2 龙芯适配时的最小依赖库(最小)
  • 4、下载
    • 4.1 通过git克隆
    • 4.2 查看所有远程分支
    • 4.3 签出一个长期支持的稳定版本
    • 4.4 查看当前本地分支版本
  • 5、使能编译环境
  • 6、开始Yocto编译
  • 7、编译中的遇到的问题
    • 7.1 在编译bison(版本bison-3.0.4)时遇到gnulib版本不匹配问题
    • 7.2 elfutils编译错误
    • 7.3 glib编译错误:directive argument is null(2处)
    • 7.4 qemu编译报错

1、基础环境介绍

操作系统:ubuntu 20.04
内存大小:12GB
磁盘空间:600GB

2、注意点

yocto poky下载和编译的整个环境(除了运行QMENU虚拟机外)不需要root权限,请尽可能不要在root环境下去操作。

3、安装依赖

3.1 yocto常规系统构建所需依赖库(较全)

sudo apt-get install -y gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev zstd liblz4-tool

3.2 龙芯适配时的最小依赖库(最小)

sudo apt-get install -y gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev xterm

4、下载

4.1 通过git克隆

$ git clone git://git.yoctoproject.org/poky
$ cd poky

一般网速较慢,请耐心等待…

4.2 查看所有远程分支

$ git branch -r

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

4.3 签出一个长期支持的稳定版本

如果构建针对龙芯的系统,可以签出sumo版本,因为龙芯官方主要是sumo版本的基础上进行构建。

$ git checkout sumo
或者使用完整命令
$ git checkout -t origin/sumo -b my-sumo

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

4.4 查看当前本地分支版本

$ git branch

在这里插入图片描述

5、使能编译环境

先进入poky目录,看一下poky目录下的内容,如下:
在这里插入图片描述

在poky目录下执行以下命令

$ source oe-init-build-env

执行结果如下图:
在这里插入图片描述

出现提示:
You can also run generated qemu images with a command like ‘runqemu qemux86’
说明使能编译操作成功,首次使能的时候会创建build目录,后面包括编译和输出的所有东西都在这个build目录下,所以build目录下的改动都是临时的,都是会变化的,所以不建议在build目录下去做代码的修改,也无法保存下来,当然也不要怕去修改build目录下的代码,为了快速和临时改动是可以接受的。

在执行 source oe-init-build-env时需要用到python2,且要求版本≥2.7.3,我的环境开始是python2和python3都安装了,默认/usr/bin/python软链接指向python3,就会出现以下错误。

在这里插入图片描述

解决此问题的方法, 可以先删除/usr/bin/python软链接,再建立一个指向/usr/bin/python3的软链接就可以了,如下:

在这里插入图片描述

6、开始Yocto编译

在build目录下执行以下命令开始编译:

$ bitbake core-image-sato

编译过程如下图:
在这里插入图片描述
因为要下载配方中的软件包并进行配置、编译、安装,第一次时间是很长的,需要耐心等待…

7、编译中的遇到的问题

7.1 在编译bison(版本bison-3.0.4)时遇到gnulib版本不匹配问题

问题描述如下:

Please port gnulib fseterr.c to your platform! Look at the definitions of ferror and cleareer on your system, then report this to bug-gnulib.

如下图:
在这里插入图片描述
问题分析:
网上查阅后是最新版本gnulib与bison不大兼容,一般正确做法是给要编译的软件包打补丁,包括以下2步。

  • 1、补丁下载
    补丁下载地址:

https://raw.githubusercontent.com/rdslw/openwrt/e5d47f32131849a69a9267de51a30d6be1f0d0ac/tools/bison/patches/110-glibc-change-work-around.patch

可以新开一个SSH终端,进入到软件包目录下直接通过wget下载,如下:

$ cd ~/Linux/yocto/poky/meta/recipes-devtools/bison/bison
$ wget https://raw.githubusercontent.com/rdslw/openwrt/e5d47f32131849a69a9267de51a30d6be1f0d0ac/tools/bison/patches/110-glibc-change-work-around.patch

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

  • 2、把下载的补丁添加到.bb文件中
    回到上一级目录,编辑bison_3.0.4.bb文件,添加110-glibc-change-work-around.patch补丁文件。
$ cd ..
$ ls
$ vim bison_3.0.4.bb

修改内容如下:
在这里插入图片描述
修改后保存退出,重新执行编译命令:

$ bitbake core-image-sato

7.2 elfutils编译错误

错误描述:

‘__elf64_msize’ specifies less restrictive attribute than its target ‘elf64_fsize’: ‘const’ [-Weeror=missing-attributes]
yocto官方patch可以参考如下:
https://docs.yoctoproject.org/pipermail/yocto/2019-June/045575.html

报错原因为warning被看作error,实质是elf中__elf64_msize变量为const,但是这里使用的时候没有标记,所以需要添加对应属性;

报错信息如下图:
在这里插入图片描述
进入到源码libelfP.h所在的目录:

$ cd ~/Linux/yocto/poky/build/tmp/work/x86_64-linux/elfutils-native/0.170-r0/libelf
$ vim libelfP.h

代码修改如下,增加2个__const_attribute__
在这里插入图片描述

7.3 glib编译错误:directive argument is null(2处)

错误描述:

…/…/glib-2.54.3/gio/gdbusauth.c:1305:11: error: ‘%’ directive argument is null [-Werror=format-overflow=]

报错信息如下图:
在这里插入图片描述

上图错误是在gdbusauth.c的1305行。

在这里插入图片描述

上图的错误是在gdbusmessage.c的2700行。

根据提示,%s的值可能为空,所以添加为空判断,如下:

gdbusauth.c修改如下:

首先进入到源码中gdbusauth.c所在的目录,然后编辑:

$ cd ~/Linux/yocto/poky/build/tmp/work/x86_64-linux/glib-2.0-native/1_2.54.3-r0/glib-2.54.3/gio
$ vim gdbusauth.c

在这里插入图片描述

gdbusmessage.c修改如下:

首先进入到源码中gdbusauth.c所在的目录,然后编辑:

$ cd ~/Linux/yocto/poky/build/tmp/work/x86_64-linux/glib-2.0-native/1_2.54.3-r0/glib-2.54.3/gio
$ vim gdbusauth.c

在这里插入图片描述

7.4 qemu编译报错

可以先通过以下命令查看一下单独编译qemu有那些可执行的任务task:

$ bitbake qemu -c listtasks

单独编译qemu

$ bitbake qemu

可以看到编译报错及警告如下:
在这里插入图片描述
1、手动处理方式:按以下思路进行修改:

1. gettid 需要rename 为 sys_gettid
2. stime 更新为 clock_settime
3. ‘SIOCGSTAMP’ undeclaration ,需要导入头文件<linux/sockios.h>

2、补丁处理方式:处理方式,网上能搜索到的的qemu-2.10.0版本补丁可以参考,参考一下补丁可以解决gettid与 ‘SIOCGSTAMP’ undeclaration问题。

由于我的qemu版本是2.11.1,因此下面补丁对应的行数是不太一样的。

--- qemu-2.10.0-clean/linux-user/syscall.c	2020-03-12 18:47:47.898592169 +0100
+++ qemu-2.10.0/linux-user/syscall.c	2020-03-12 19:16:41.563074307 +0100
@@ -34,6 +34,7 @@#include <sys/resource.h>#include <sys/swap.h>#include <linux/capability.h>
+#include <linux/sockios.h> // https://lkml.org/lkml/2019/6/3/988#include <sched.h>#include <sys/timex.h>#ifdef __ia64__
@@ -116,6 +117,8 @@ int __clone2(int (*fn)(void *), void *ch#include "qemu.h"+extern unsigned int afl_forksrv_pid;
+#ifndef CLONE_IO#define CLONE_IO                0x80000000      /* Clone io context */#endif@@ -256,7 +259,9 @@ static type name (type1 arg1,type2 arg2,#endif#ifdef __NR_gettid
-_syscall0(int, gettid)
+// taken from https://patchwork.kernel.org/patch/10862231/
+#define __NR_sys_gettid __NR_gettid
+_syscall0(int, sys_gettid)#else/* This is a replacement for the host gettid() and must return a hosterrno. */
@@ -6219,7 +6224,8 @@ static void *clone_func(void *arg)cpu = ENV_GET_CPU(env);thread_cpu = cpu;ts = (TaskState *)cpu->opaque;
-    info->tid = gettid();
+    // taken from https://patchwork.kernel.org/patch/10862231/
+    info->tid = sys_gettid();task_settid(ts);if (info->child_tidptr)put_user_u32(info->tid, info->child_tidptr);
@@ -6363,9 +6369,11 @@ static int do_fork(CPUArchState *env, unmapping.  We can't repeat the spinlock hack used above becausethe child process gets its own copy of the lock.  */if (flags & CLONE_CHILD_SETTID)
-                put_user_u32(gettid(), child_tidptr);
+                // taken from https://patchwork.kernel.org/patch/10862231/
+                put_user_u32(sys_gettid(), child_tidptr);if (flags & CLONE_PARENT_SETTID)
-                put_user_u32(gettid(), parent_tidptr);
+                // taken from https://patchwork.kernel.org/patch/10862231/
+                put_user_u32(sys_gettid(), parent_tidptr);ts = (TaskState *)cpu->opaque;if (flags & CLONE_SETTLS)cpu_set_tls (env, newtls);
@@ -11402,7 +11410,8 @@ abi_long do_syscall(void *cpu_env, int nbreak;#endifcase TARGET_NR_gettid:
-        ret = get_errno(gettid());
+        // taken from https://patchwork.kernel.org/patch/10862231/
+        ret = get_errno(sys_gettid());break;#ifdef TARGET_NR_readaheadcase TARGET_NR_readahead:

关于stime的问题,按如下方式修改。

//ret = get_errno(stime(&host_time));	//注释使用stime的这一行,增加下面这一行改为clock_settime(CLOCK_REALTIME, &host_time)
ret = get_errno(clock_settime(CLOCK_REALTIME, &host_time));

修改完这些,qemu-2.11.1就可以编译过去了。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业相机采图方式、图像格式(BYTE、HObject和Mat)转换

1、概述 机器视觉项目中&#xff0c;如何采集到合适的图像是项目的第一步&#xff0c;也是最重要的一步&#xff0c;直接关系到后面图像处理算法及最终执行的结果。所以采用不同的工业相机成像以及如何转换成图像处理库所需要的格式成为项目开发中首先要考虑的问题。 2、工业…

微服务day05(中) -- ES索引库操作

索引库就类似数据库表&#xff0c;mapping映射就类似表的结构。 我们要向es中存储数据&#xff0c;必须先创建“库”和“表”。 2.1.mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数据类型&#xff0c;…

数据分析-Pandas序列滑动窗口配置参数

数据分析-Pandas序列滑动窗口配置参数 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

【DataWhale】灵境Agent开发——低代码创建AI智能体

灵境Agent开发——低代码创建AI智能体 3 灵境 Agent 低代码开发 ​ 低代码模式支持开发者通过编排工作流的方式快速构建智能体&#xff0c;您可以通过拖拽和组合模型、提示词、代码等模块&#xff0c;实现准确的、复杂的业务流程。 ​ 个人体验下来&#xff0c;目前这个低代…

【Entity Framework】 EF中DbContext类详解

【Entity Framework】 EF中DbContext类详解 一、概述 DbContext类是实体框架的重要组成部分。它是应用域或实例类与数据库交互的桥梁。 从上图可以看出DbContext是负责与数据交互作为对象的主要类。DbContext负责以下活动&#xff1a; EntitySet&#xff1a;DbContext包含…

【linux】CentOS查看系统信息

一、查看版本号 在CentOS中&#xff0c;可以通过多种方法来查看版本号。以下是几种常用的方法&#xff1a; 使用cat命令查看/etc/centos-release文件&#xff1a; CentOS的版本信息存储在/etc/centos-release文件中。可以使用cat命令来显示该文件的内容&#xff0c;从而获得C…

鸿蒙ArkTS实战开发-Native XComponent组件的使用

介绍 本篇Codelab主要介绍如何使用XComponent组件调用NAPI来创建EGL/GLES环境&#xff0c;实现在主页面绘制一个正方形&#xff0c;并可以改变正方形的颜色。本篇CodeLab使用Native C模板创建。 如图所示&#xff0c;点击绘制矩形按钮&#xff0c;XComponent组件绘制区域中渲…

递归和递推的区别

目录 1、递推 2、递归 3、结言 递归 递推 1、递推 递推就是说从初值出发后一直运算到所需的结果。 ——从已知到未知。&#xff08;从小到大&#xff09; 举一个简单的例子&#xff1a; 每天能学习一个小时的编程&#xff0c;那么一个月之后可以学到三十小时的编程知识。…

同义词的作用

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 同义词 同义词本质上属于近义词的概念&#xff0c;它是表、索引、视图等模式对象的一个别名 通过为模式对象创建同义词&#xff0c;可以隐藏对象的实际名称和所有者信息&a…

Linux安装Nacos

安装前必要准备 准备Java环境 &#xff0c;8以上的版本&#xff0c;mysql&#xff08;集群相关信息&#xff09;&#xff0c;nginx&#xff08;进行代理&#xff09; 安装Nacos 首先我们要有一个nacos的包&#xff0c;我们可以在线下载&#xff0c;也可以提前下载好&#xf…

【爬取网易财经文章】

引言 在信息爆炸的时代&#xff0c;获取实时的财经资讯对于投资者和金融从业者来说至关重要。然而&#xff0c;手动浏览网页收集财经文章耗时费力&#xff0c;为了解决这一问题&#xff0c;本文将介绍如何使用Python编写一个爬虫程序来自动爬取网易财经下关于财经的文章 1. 爬…

【史上最全面arduino esp32教程】I2C接口LCD1602的使用

文章目录 前言一、安装驱动库二、LCD1602的各种操作2.1 点亮LCD16022.2 LCD1602其他函数清除显示屏上的所有字符将光标位置移动到显示屏的起始位置关闭显示屏&#xff0c;不会显示任何字符打开显示屏&#xff0c;开始显示字符关闭光标闪烁打开光标闪烁&#xff0c;使光标呈现闪…

踩了一天Prophet的fbprophet坑

pip怎么安装Prophet 安装了这个不行,要安装fbprophet 然后安装不起 哦豁 anaconda虚拟环境安装好将其导入pycharm from fbprophet import Prophet 然后不报错了,很稀奇对吧,不报错了 但是运行还是给你显示 没有fbprophet 绝望了,找人吧 通过官方网站安装最新版Prophet,但是…

洛谷_P1873 [COCI 2011/2012 #5] EKO / 砍树_python写法

P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) n, m map(int,input().split())data list(map(int,input().split())) h 0 def check(mid):h 0for i in data:if i>mid:h (i-mid)if h < m:return Trueelse:return Falsel 0 r …

游戏反云手机检测方案

游戏风险环境&#xff0c;是指独立于原有设备或破坏设备原有系统的环境。常见的游戏风险环境有&#xff1a;云手机、虚拟机、虚拟框架、iOS越狱、安卓设备root等。 这类风险环境可以为游戏外挂、破解提供所需的高级别设备权限&#xff0c;当游戏处于这些风险环境下&#xff0c…

【保姆级】前端使用node.js基础教程

文章目录 安装和版本管理&#xff1a;npm 命令&#xff08;Node 包管理器&#xff09;&#xff1a;运行 Node.js 脚本&#xff1a;调试和开发工具&#xff1a;其他常用命令&#xff1a;模块管理&#xff1a;包管理&#xff1a;调试工具&#xff1a;异步编程和包管理&#xff1a…

python的O2O生鲜食品订购flask-django-nodejs-php

用户只能通过一些类似软件进行查看生鲜超市&#xff0c;这样的管理方式仍然是比较机械传统的&#xff0c;本文通过对市面上常见的线上管理系统与现实生活中结合问题的讨论&#xff0c;从一个微信小程序的O2O生鲜食品订购角度进行需求分析&#xff0c;提供一些新的思路&#xff…

使用Lerna搭建业务组件库

Lerna基本概念 Lerna 是一个用来优化托管在 git\npm 上的多 package 代码库的工作流的一个管理工具,可以让你在主项目下管理多个子项目&#xff0c;从而解决了多个包互相依赖&#xff0c;且发布时需要手动维护多个包的问题。 主要功能&#xff1a; 为单个包或多个包运行命令 …

基于Gabor滤波器的指纹图像识别,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

vben admin路由跳转拿不到param参数问题

vben admin路由跳转拿不到param参数问题 问题原因&#xff1a; 也就是说&#xff0c;从Vue Router的2022-8-22 这次更新后&#xff0c;我们使用上面的方式在新页面无法获取&#xff1a; vue也给我们提出了解决方案&#xff1a; ​ 1.使用 query 的方式传参 ​ 2.将参数放…