嵌入式-交叉编译链

一、Buildroot

Official website:

https://buildroot.org/downloads/manual/manual.html

Buildroot是Linux平台上一个用于构建嵌入式Linux系统的框架,它简化了系统构建过程并实现了工作的自动化。以下是对Buildroot的详细介绍:

一、概述

Buildroot是一个开源的嵌入式Linux系统自动构建框架,由Makefile脚本和Kconfig配置文件构成。它允许用户通过配置和编译,生成一个完整的可以直接烧写到机器上运行的Linux系统软件,包括boot、kernel、rootfs以及rootfs中的各种库和应用程序。

二、目录结构

Buildroot的目录结构清晰,主要包括以下几个部分:

  • arch:存放CPU架构相关的配置脚本,如arm、mips、x86等。这些配置在制作工具链、编译uboot和kernel时非常关键。
  • board:存放各种开发板特有的配置脚本。
  • boot:存放各种boot软件的自动构建脚本,如u-boot、grub等。
  • configs:放置开发板的一些全局配置文件。这些配置文件记录着机器平台或方案使用的工具栏、boot、kernel以及各种应用软件包的配置和是否编译选择的状态。
  • dl:存放下载的源代码及应用软件的压缩包。
  • docs:存放相关的参考文档。
  • fs:存放各种文件系统的源代码。
  • linux:存放Linux kernel的自动构建脚本。
  • Makefile:Buildroot的主Makefile文件。
  • output:编译输出的文件夹,包含build、host、images、staging和target等子目录。其中,images目录存放着编译好的可烧写到板子里的镜像文件。
  • package:存放各种第三方开源应用软件包的自动编译构建脚本。
  • support:存放一些固定的流程脚本,以备构建时调用执行。
  • system:存放文件系统目录和设备节点的模板,用于制作根文件系统rootfs。
  • toolchain:存放各种制作工具链的脚本。

三、使用方法

使用Buildroot构建嵌入式Linux系统通常包括以下几个步骤:

  1. 选择一个defconfig:通过make xxx_defconfig命令选择一个默认的配置文件。这个文件通常位于configs目录下。
  2. 配置Buildroot:使用make menuconfig命令进行配置。在配置界面中,可以选择目标板架构特性、配置编译选项、交叉工具链、系统配置、目标软件包、文件系统镜像以及引导加载程序等。
  3. 编译Buildroot:使用make all命令进行编译。编译过程中,Buildroot会自动下载所需的源代码、配置并构建交叉编译工具链、目标软件包、内核镜像以及引导加载程序等。
  4. 运行Buildroot构建的系统:编译完成后,可以在qemu或者目标板上运行Buildroot构建的系统。生成的镜像文件通常位于output/images/目录下。

四、实际使用

找到实际项目中使用的目录文件:

arm-buildroot-linux-gnueabi-addr2line   arm-buildroot-linux-gnueabi-gdb      arm-linux-c++         arm-linux-ld.bfd   infocmp
arm-buildroot-linux-gnueabi-ar          arm-buildroot-linux-gnueabi-gprof    arm-linux-cc          arm-linux-nm       infotocap
arm-buildroot-linux-gnueabi-as          arm-buildroot-linux-gnueabi-ld       arm-linux-c++filt     arm-linux-objcopy  m4
arm-buildroot-linux-gnueabi-c++         arm-buildroot-linux-gnueabi-ld.bfd   arm-linux-cpp         arm-linux-objdump  makedevs
arm-buildroot-linux-gnueabi-cc          arm-buildroot-linux-gnueabi-nm       arm-linux-elfedit     arm-linux-ranlib   ncurses5-config
arm-buildroot-linux-gnueabi-c++filt     arm-buildroot-linux-gnueabi-objcopy  arm-linux-g++         arm-linux-readelf  pkgconf
arm-buildroot-linux-gnueabi-cpp         arm-buildroot-linux-gnueabi-objdump  arm-linux-gcc         arm-linux-size     pkg-config
arm-buildroot-linux-gnueabi-elfedit     arm-buildroot-linux-gnueabi-ranlib   arm-linux-gcc-4.9.3   arm-linux-strings  reset
arm-buildroot-linux-gnueabi-g++         arm-buildroot-linux-gnueabi-readelf  arm-linux-gcc-ar      arm-linux-strip    tabs
arm-buildroot-linux-gnueabi-gcc         arm-buildroot-linux-gnueabi-size     arm-linux-gcc-nm      captoinfo          tic
arm-buildroot-linux-gnueabi-gcc-4.9.3   arm-buildroot-linux-gnueabi-strings  arm-linux-gcc-ranlib  clear              toe
arm-buildroot-linux-gnueabi-gcc-ar      arm-buildroot-linux-gnueabi-strip    arm-linux-gcov        faked              tput
arm-buildroot-linux-gnueabi-gcc-nm      arm-linux-addr2line                  arm-linux-gdb         fakeroot           tset
arm-buildroot-linux-gnueabi-gcc-ranlib  arm-linux-ar                         arm-linux-gprof       gawk               xmlwf
arm-buildroot-linux-gnueabi-gcov        arm-linux-as                         arm-linux-ld          igawk

其中的工具类:

addr2line、ar、c++filt、gold、gprof、nm、objcopy、objdump、ranlib、

readelf、size、strings、strip

创建代码:

#include <stdio.h>                                                                                                                          
#include <stdlib.h>int main()
{printf("---ARM Kernel---!\n");return (0);
}

创建好make 导入参数的文件MakeMain:

找到项目工程中的需要导入的编译链和参数

export TOOLCHAIN_BASE=/opt/trendchip/buildroot-gcc493_glibc222_arm32_32bServer/usr
export TOOLCHAIN_LIB=$(TOOLCHAIN_BASE)/arm-buildroot-linux-gnueabi/sysroot/lib
export HOST=arm-linux
export CROSS=arm-buildroot-linux-gnueabi-
export PATH :=$(TOOLCHAIN_BASE)/bin/:$(PATH)
export CROSS_COMPILE=$(CROSS)
export CC=$(CROSS)gcc -mfloat-abi=soft
export CCC=$(CROSS)g++ -mfloat-abi=soft
export LD=$(CROSS)ld
export LD = $(CROSS)ld
export AR=$(CROSS)ar
export STRIP=$(CROSS)strip
export RANLIB = $(CROSS)ranlib
export SYSROOT=$(TOOLCHAIN_BASE)/arm-buildroot-linux-gnueabi/sysroot
export LD_LIBRARY_PATH:=$(TOOLCHAIN_BASE)/lib:$(LD_LIBRARY_PATH)
export ARCH_CFLAGS =#command
# export TOOLCHAIN_BASE=/opt/trendchip/buildroot-gcc493_glibc222_arm32_32bServer/usr
# export TOOLCHAIN_LIB=/opt/trendchip/buildroot-gcc493_glibc222_arm32_32bServer/usr/arm-buildroot-linux-gnueabi/sysroot/lib
# export PATH=/opt/trendchip/buildroot-gcc493_glibc222_arm32_32bServer/usr/bin/:/new_home/liyong/bin:/new_home/liyong/.local/bin:/usr/lib/jvm/java-8-openjdk-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/repo:/snap/bin
# export CROSS_COMPILE=arm-buildroot-linux-gnueabi-
# export CC=arm-buildroot-linux-gnueabi-gcc-mfloat-abi=soft
# export CCC=arm-buildroot-linux-gnueabi-g++-mfloat-abi=soft
# export LD=arm-buildroot-linux-gnueabi-ld
# export AR=arm-buildroot-linux-gnueabi-ar
# export STRIP=arm-buildroot-linux-gnueabi-strip
# export RANLIB=arm-buildroot-linux-gnueabi-ranlib
# export SYSROOT=/opt/trendchip/buildroot-gcc493_glibc222_arm32_32bServer/usr/arm-buildroot-linux-gnueabi/sysroot
# export LD_LIBRARY_PATH=/opt/trendchip/buildroot-gcc493_glibc222_arm32_32bServer/usr/lib:/usr/lib/x86_64-linux-gnu/libfakeroot:/usr/lib64/libfakeroot:/usr/lib32/libfakeroot
# export ARCH_CFLAGS=cpu:echo "Build cpu"
ifeq ($(strip $(COMPILE_TOOLCHAIN)),mips-linux)echo "mips"export TEMPCC=$(CC)export CC="$(CC)$(TC3162_CFLAG)"
endif$(MAKE) -C apps/public/cpuif test -e apps/public/cpu/cpu; \then echo "Compile cpu success"; \else echo "Compile cpu error!"; exit 1; \fi
#	rm apps/public/cpu/cpu

软件编译:makefile

#CROSS_COMPILE=mips-linux-
#CC=$(CROSS_COMPILE)gcc
AR=$(CROSS_COMPILE)ar
LD=$(CROSS_COMPILE)ld
STRIP=$(CROSS_COMPILE)strip
RANLIB=$(CROSS_COMPILE)ranlib
SIZE=$(CROSS_COMPILE)size#CFLAGS = -mips1 -msoft-float -O2 -fomit-frame-pointer
CFLAGS = -fomit-frame-pointerifneq ($(strip $(TCSUPPORT_CODE_SHRINK)),)
CFLAGS += -Os
else
CFLAGS += -O2
endifEXEC = cpu
OBJS = cpu.oall: $(EXEC).c.o:$(CC) -c $(CFLAGS) $<$(EXEC): $(OBJS)$(CC) $(OBJS) -o $@$(STRIP) -s $@ clean:-rm -f $(EXEC) *.elf *.o

使用指令:

fakeroot make -f MakeMain cpu 或者直接进入fakeroot模式

查看文件属性属于ARM架构:

导入目标板子运行:

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

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

相关文章

pdf删除几个页面怎么操作?PDF页面删除的快捷方法

pdf删除几个页面怎么操作&#xff1f;在日常办公与学习中&#xff0c;PDF文件因其跨平台兼容性和良好的格式保持性而广受欢迎。然而&#xff0c;随着文件内容的累积&#xff0c;PDF文档往往会变得庞大而臃肿&#xff0c;不仅占用存储空间&#xff0c;还可能在传输时造成不便。因…

【优选算法篇】双指针的华丽探戈:深入C++算法殿堂的优雅追寻

文章目录 C 双指针详解&#xff1a;进阶题解与思维分析前言第一章&#xff1a;有效三角形的个数1.1 有效三角形的个数示例 1&#xff1a;示例 2&#xff1a;解法一&#xff08;暴力求解&#xff09;解法二&#xff08;排序 双指针&#xff09;易错点提示代码解读 第二章&#…

在线文字转语音哪个好?教你7个ai文字转语音配音的方法,别错过!

随着人工智能技术的飞速发展&#xff0c;ai文字转语音配音软件已经开始广泛应用&#xff0c;能够生成或修改出逼真的人声。这些文字转语音在线版不仅易于使用&#xff0c;连没有专业音频处理技术的用户也能轻松上手。通过这些软件&#xff0c;您只需简单输入文本或上传音频文件…

【随时随地学算法】本地部署hello-algo结合内网穿透远程学习新体验

文章目录 前言1.关于hello-algo2.安装Docker和Docker compose3.本地部署hello-algo4. hello-algo本地访问5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 本篇文章主要介绍如何在本地部署hello-algo算法学习必备项目&#xff0c;并结合cpolar…

PostgreSQL 17重磅登场——世界上最成功的数据库

朋友们&#xff0c;万众期待的 PostgreSQL 大版本发布又来了&#xff01;这一次&#xff0c;PostgreSQL 17 带着全新的性能优化和开发者必备的新功能强势登场。与其说这是一场普通的更新&#xff0c;不如说它是一场专为高并发工作负载和海量数据量身打造的技术嘉年华&#xff0…

【优选算法篇】编织算法的流动诗篇:滑动窗口的轻盈之美

文章目录 C 滑动窗口详解&#xff1a;基础题解与思维分析前言第一章&#xff1a;热身练习1.1 长度最小的子数组解法一&#xff08;暴力求解&#xff09;解法二&#xff08;滑动窗口&#xff09;滑动窗口的核心思想图解分析滑动窗口的有效性时间复杂度分析易错点提示 1.2 无重复…

基于webrtc实现音视频通信

与传统通信方式不同&#xff0c;p2p通信的实现过程不依赖于中间服务器的信息收发&#xff0c;直接通过信令等完成通信过程的建立&#xff1b; 通过websocket实现信令服务器的建立&#xff0c;而通过信令来确定通信双方&#xff1b; webrtc通过 sdp协议来完善通信双方间协议的…

塞班和诺基亚(中古手机图,你见过哪个?)

诺基亚的塞班系统&#xff0c;是比较早和强大的移动操作系统了。当时还有Palm&#xff0c;微软的平台&#xff0c;但市占率都很低。 安卓从被谷歌收购那天&#xff0c;每个特性都预示着&#xff0c;未来一定会超越塞班。而塞班后来取消了生态&#xff0c;自己来使用&#xff0c…

mac上docker desktop 服务指南

容器化技术是指将软件代码与运行此代码所需的操作系统 (OS) 库和依赖项进行集体打包&#xff0c;以便创建可在任意基础设施上一致运行的单个轻量级可执行文件&#xff08;称为容器&#xff09;&#xff0c;比物理机部署具备更好的可移植性和维护性&#xff0c;比虚拟机具有更高…

基于Spring Boot+Vue的医疗健康的便民服务平台系统的设计与实现(协同过滤算法、实时聊天)

&#x1f388;系统亮点&#xff1a;协同过滤算法、实时聊天&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架…

atcoder abc375

A seats 代码&#xff1a; #include <bits/stdc.h> using namespace std;int main() {int n;cin >> n;vector<char> a(n 1);for(int i 1; i < n; i ) cin >> a[i];int cnt 0;for(int i 1; i < n - 2; i ) {if(a[i] # && a[i 1…

【spring ai】java 实现RAG检索增强,超快速入门

rag 需求产生的背景介绍&#xff1a; 在使用大模型时&#xff0c;一个常见的问题是模型会产生幻觉&#xff08;即生成的内容与事实不符&#xff09;&#xff0c;同时由于缺乏企业内部数据的支持&#xff0c;导致其回答往往不够精准和具体&#xff0c;偏向于泛泛而谈。这些问题…

STM32 实现 TCP 服务器与多个设备通信

目录 一、引言 二、硬件准备 三、软件准备 四、LWIP 协议栈的配置与初始化 五、创建 TCP 服务器 1.创建 TCP 控制块 2.绑定端口 3. 进入监听状态 4.设置接收回调函数 六、处理多个客户端连接 七、数据处理与通信管理 八、错误处理与资源管理 九、总结 一、引…

【C++】:工厂模式

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 简单工厂模什么是简单工厂模式&#xff1f;如何实现简单工厂模式&#xff1f; 工厂方法抽象工厂模式总结简单工厂模式工厂方法抽象工厂「Abstract Factory」 简单工厂模 什么是简单工厂模式&#xf…

ps提示不能使用移动工具,因为目标通道被隐藏的解决办法

解决&#xff1a;按F7&#xff0c;或者从窗口把图层打开 按图示找到快速蒙版图层。它可能被隐藏或以特殊图标显示。右键删除或者拖到右下角垃圾桶里

小猿口算炸鱼脚本

目录 写在前面&#xff1a; 一、关于小猿口算&#xff1a; 二、代码逻辑 1.数字识别 2.答题部分 三、代码分享&#xff1a; 补充&#xff1a;软件包下载 写在前面&#xff1a; 最近小猿口算已经被不少大学生攻占&#xff0c;小学生直呼有挂。原本是以为大学生都打着本…

从融资烧钱到商业落地:中国AI大模型步入「实战期」

在AI还尚且未达到生产力工具的时候&#xff0c;没人能知道怎样的基础模型会是尽头&#xff0c;以及对付费客户而言&#xff0c;他们如何才能将这笔投入转化为真实营收。 而对于大模型究竟什么能盈利&#xff0c;目前国内的任何一家都未表过态。或者说&#xff0c;这不是一个当…

从0开始深度学习(11)——多层感知机

前面介绍了线性神经网络&#xff0c;但是线性模型是有可能出错的&#xff0c;因为线性模型意味着是单调假设&#xff0c;但是现实中往往很复杂。例如&#xff0c;我们想要根据体温预测死亡率。 对体温高于37摄氏度的人来说&#xff0c;温度越高风险越大。 然而&#xff0c;对体…

MySQL插入优化-性能对比

插入优化主要包括&#xff1a; 批量插入条数据&#xff0c;而不是单个记录逐条插入。手动提交事务&#xff0c;避免自动提交事务带来的额外开销。使用load命令从本地文件导入。 性能对比 创建数据库表 CREATE TABLE if not exists tb_sku ( id int(20) …

facefusion,使用CPU实现一键图片、视频换脸,无需显卡,无限时长(附下载即用的整合包)

FaceFusion 是一种利用人工智能技术将两张或多张人脸融合在一起的图像处理技术。这种技术通过面部特征的识别和重构&#xff0c;将不同的人脸混合成一张新的脸&#xff0c;生成的图像看起来像是这些人脸的融合体。 FaceFusion使用深度学习算法&#xff0c;来捕捉人脸的细节和特…