当前位置: 首页 > article >正文

【香橙派系列教程】(二十一) 基于OrangePi Zero2的系统移植— 交叉编译工具链配置

【二十一】基于OrangePi Zero2的系统移植— 交叉编译工具链配置

文章目录

  • 【二十一】基于OrangePi Zero2的系统移植— 交叉编译工具链配置
    • 1.关于编译
    • 2.本地编译
    • 3.交叉编译

1.关于编译

编译是指将源代码文件(如C/C++文件)经过预处理、编译、汇编和链接等步骤,转换为可执行文件的过程。将源代码转换成机器代码的过程称为编译(Compile),编译的工作需要编译器(Complier)来完成。

2.本地编译

本地编译是指在当前的编译平台上,生成能在当前平台上运行的可执行文件。例如,在x86平台上,使用x86平台上的工具,开发针对x86平台本身的可执行程序,这个编译过程称为本地编译。
以一个简单的例子来说明本地编译,假设有一个hello.c文件,它包含以下内容:

#include <stdio.h>
int main()
{
    printf("Hello, world!\n");
    return 0;
}

我们想要在x86平台上进行本地编译,并在x86平台上运行这个程序。可以使用以下命令:

gcc -o hello hello.c

运行:

./hello

//输出结果为:
Hello, world!

3.交叉编译

交叉编译是指在当前的编译平台上,生成能在体系结构不同的另一种目标平台上运行的可执行文件。例如,在x86平台上,使用针对ARM平台的工具,开发针对ARM平台的可执行程序,这个编译过程称为交叉编译
以一个简单的例子来说明本地编译,假设有一个hello.c文件,它包含以下内容:

#include <stdio.h>
int main()
{
    printf("Hello, world!\n");
    return 0;
}

想要在x86平台上进行交叉编译,并在ARM平台上运行这个程序。首先需要在虚拟主机家目录下的.bashrc最后配置添加交叉编译工具链:

test@test:~$ vi .bashrc

最后面添加:

export PATH=$PATH:/home/$(whoami)/orangepi-build/toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin

然后断开重连桌重新登陆后, 执行export指令,即可看到最新导入的PATH环境变量:

image-20240804141512254

test@test:~$ export
declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
declare -x DISPLAY="localhost:10.0"
declare -x HOME="/home/pg"
declare -x LANG="en_US.UTF-8"
declare -x LC_ADDRESS="zh_CN.UTF-8"
declare -x LC_IDENTIFICATION="zh_CN.UTF-8"
declare -x LC_MEASUREMENT="zh_CN.UTF-8"
declare -x LC_MONETARY="zh_CN.UTF-8"
declare -x LC_NAME="zh_CN.UTF-8"
declare -x LC_NUMERIC="zh_CN.UTF-8"
declare -x LC_PAPER="zh_CN.UTF-8"
declare -x LC_TELEPHONE="zh_CN.UTF-8"
declare -x LC_TIME="zh_CN.UTF-8"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LOGNAME="pg"
declare -x MOTD_SHOWN="pam"
declare -x OLDPWD="/home/pg/orangepi-build/toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin"
declare -x
PATH="/home/pg/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/pg/orangepi-build/toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin:/home/pg/orangepi-build/toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin"

同时执行aarch64-none-linux-gnu-gcc --version 可以看到对应的版本号:

image-20240804164251004

test@test:~$ aarch64-none-linux-gnu-gcc --version
aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)) 9.2.1
20191025
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

在x86平台上进行交叉编译,可以使用以下命令:

image-20240804170017728

aarch64-none-linux-gnu-gcc -o hello hello.c

利用file命令可以看到编译出来的程序是ARM aarch64的二进制程序

test@test:~/test$ file hello
hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically
linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, with
debug_info, not stripped

这时候需要将该文件拷贝到比如香橙派等ARM开发板上运行, 在X86宿主机上是无法正常运行的。

image-20240804164522893

scp hello orangepi@192.168.1.28:/home/orangepi

http://www.kler.cn/news/283378.html

相关文章:

  • 【C++ 面试 - 内存管理】每日 3 题(九)
  • 算法中常用的排序
  • 云计算实训37——Dockerfile的应用+私有仓库的创建与管理
  • 更改图片中的部分颜色及修改图片的背景色
  • 如何知道当前网卡连接的下位机的IP,通过工具实现
  • 代码随想录 | 贪心算法总结
  • 负载均衡OJ项目详细解剖
  • Error running tomcat: Can‘t find catalina.jar
  • 给自己复盘的随想录笔记-哈希表
  • Furion+SqlSugar+Swagger企业级后端工程师 - 学习路线总目录
  • 【IEEE独立出版,快检索 | 高录用】第五届IEEE信息科学与教育国际学术会议(ICISE-IE 2024,12月20-22)
  • 如何禁止电脑访问网站
  • 一维/二维高斯分布的负对数似然推导
  • 【日常记录-Linux】.tar.xz、.tar.bz2、tar.gz解压
  • 8、嵌套循环 - 循环中的循环 - 课件
  • MySQL表分区与分表:概念、规则及应用案例
  • MyPrint打印设计器(四)vue3 函数式调用组件
  • vue3 使用vue-masonry加载更多,重新渲染
  • Java设计模式之装饰器模式详细讲解和案例示范
  • 深度学习:图像数据分析的革命
  • HTML静态网页成品作业(HTML+CSS)——电影肖申克的救赎介绍设计制作(1个页面)
  • jmeter连接mysql数据库以及常规用法
  • node环境安装、vue-cli搭建过程、element-UI搭建使用过程
  • 生产监控系统与生产控制系统区别
  • 【实践经验】端口被占用问题:listen tcp:bind:only one usage of each socket address
  • 文心智能体-梦想目标实现助手-实现你的老板梦
  • Golang小项目(1)
  • asp.net core在win上的发布和部署
  • 命令模式与事件驱动编程:如何将两者结合以优化系统设计
  • 卸载重装redis