Linux交叉编译

news2024/12/25 9:15:36

目录

一. 下载交叉编译工具

1.使用环境要求

2.获取Linux SDK 

方法一:从github上下载orangepi-build

方法二:从百度网盘下载提前编译好的Linux SDK包

通过以下命令进行合并解压

3.修改配置脚本

 4.首次编译完整的SDK

1.运行build.sh脚本

2.选择Full OS image for flashing进行完整镜像的编译

 3.选择不修改配置

 4.根据实际的香橙派派开发版的型号,选orangepizero2

5. 选择根文件系统类型,这边选择ubuntu 22.04的根文件系统,也就是jammy:

6. 选择带桌面环境的

7.最后选择桌面环境,这边选择xfce:

8.编译完成后,/home/mi/orangepi-build/output/images/Orangepizero2_3.1.0_ubuntu_jammy_desktop_xfce_linux5.16.17下存在Orangepizero2_3.1.0_ubuntu_jammy_desktop_xfce_linux5.16.17.img镜像。可烧写到SD卡上运行。

5.要使用交叉编译工具链就必须进入层层目录,因此,需要配置环境变量。

6.配置好环境变量后重启当前操作系统

二. 交叉编译简单案例

lib_test.so

main.c

利用交叉编译工具进行编译 

发送编译好的文件到orangepi上

远程连接进入orangepi的操作系统中,即可看到发过来的文件 

三. 交叉编译wiringOP库

1. 修改build.sh脚本,在echo “WiringPi Library” 之前添加以下内容,创建用于存放生成的头文件和库文件的文件夹:

2. 修改devLib/Makefile、gpio/Makefile、wiringPiD/Makefile、wiringPi/Makefile

3. 修改devLib/Makefile、gpio/Makefile、wiringPiD/Makefile 、wiringPi/Makefile,目的是使编译生成的文件都保存在_install / usr

4. 修改wiringPi/Makefile

5.修改devLib/Makefile

 6.devLib/Makefile,链接交叉编译时所需要的头文件

7.开始执行,这时候,就会wiringOP-master下生成_INSTALL目录,里面有完整编译出来的库文件和头文件

 8. 打包成压缩包

9. 使用scp传输文件到香橙派

10.进行解压

11.将_install里的内容拷贝到香橙派的根目录下

12.帮助系统更新共享库缓存,以便动态链接器能够正确地定位和加载这些共享库文件。

13.然后就可以使用该库了

三.智能垃圾桶交叉编译

1.调整项目的结构为:

2.增加3rd目录,用于存放wiringOP和python3.10等第三方依赖库和头文件。

首先,从香橙派上利用apt download下载依赖包的头文件和库文件,并拷贝到宿主机里:

3. 解压到/home/mi/Desktop/Class/3rd/下

4. 编写Makefile

5. 进行编译,但是此时出现错误

6. 进行编译

7. 发送编译生成的garbage到orangepi



一. 下载交叉编译工具

1.使用环境要求

新版本的orangepi-build是在Ubuntu22.04的x64电脑或虚拟机上运行的,因为编译出的SDK大概有16G大小,因此,至少给虚拟机分配50G的大小。

lsb_release -a //查看自己的虚拟机版本

2.获取Linux SDK 

方法一:从github上下载orangepi-build
sudo apt update
sudo apt install git
git clone https://github.com/orangepi-xunlong/orangepi-build.git -b next
方法二:从百度网盘下载提前编译好的Linux SDK包

下载下来后是几个拆分好的压缩包,orangepi-build-ok.tar.gz_00                orangepi-build-ok.tar.gz_01                orangepi-build-ok.tar.gz_02

通过以下命令进行合并解压
cat orangepi-build-ok.tar.gz_0* > orangepi-build-ok.tar.gz
tar -xvf orangepi-build-ok.tar.gz

3.修改配置脚本

vi ./external/config/sources/families/sun50iw9.conf

默认内核配置版本是6.1.y,改为5.16.y。不然6.1.y默认编译出的内核没有无线网卡和I2C也不支持

 4.首次编译完整的SDK

若从百度网盘下载后,由于已经包含了交叉编译工具链,uboot和内核源码,可不允许build.sh脚本

1.运行build.sh脚本
sudo ./build.sh

 如果是第一次运行orangepi-build中的build.sh脚本时会自动下载交叉编译工具链、u-boot和linux内核源码,成功编译完一次linux镜像后在orangepi-build中可以看到的文件和文件夹有:

a. external:包含编译镜像需要用的配置文件

b. kernel:存放linux内核的源码

c. LICENSE: GPL 2许可证文件

d. README.md: orangepi-build说明文件

e. output:存放编译生成的u-boot、linux等deb包、编译日志以及编译生成的镜像等文件

f. toolchains:存放交叉编译工具链

g.  u-boot:存放u-boot的源码

h.  userpatches:存放编译脚本需要用到的配置文件

2.选择Full OS image for flashing进行完整镜像的编译

 3.选择不修改配置

 4.根据实际的香橙派派开发版的型号,选orangepizero2

5. 选择根文件系统类型,这边选择ubuntu 22.04的根文件系统,也就是jammy:

6. 选择带桌面环境的

7.最后选择桌面环境,这边选择xfce:

8.编译完成后,/home/mi/orangepi-build/output/images/Orangepizero2_3.1.0_ubuntu_jammy_desktop_xfce_linux5.16.17下存在Orangepizero2_3.1.0_ubuntu_jammy_desktop_xfce_linux5.16.17.img镜像。可烧写到SD卡上运行。
 

5.要使用交叉编译工具链就必须进入层层目录,因此,需要配置环境变量。

vi .bashrc

最后面添加

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

6.配置好环境变量后重启当前操作系统

二. 交叉编译简单案例

lib_test.so
#include <stdio.h>

void part(){
	printf("hello world\n");
}
main.c
void part();

int main(){
	part();
	return 0;
}
利用交叉编译工具进行编译 
//编译生成共享库
gcc –shared –fPIC –o lib_test.so lib_test.c

//编译的时候需要链接上面生成的动态库
aarch64-none-linux-gnu-gcc -o main.out main.c -L /home/mi/Desktop/ -l_test
//或者是aarch64-none-linux-gnu-gcc -o main.out main.c /home/mi/Desktop/666/lib_test.so
发送编译好的文件到orangepi上
scp lib_test.so orangepi@192.168.81.202:/home/orangepi/Class
scp main.out orangepi@192.168.81.202:/home/orangepi/Class
远程连接进入orangepi的操作系统中,即可看到发过来的文件 
//1.配置环境变量:将动态库lib_test.so的路径/home/orangepi添加到ld.so.conf的最后一行
cd /etc
vi ld.so.conf
//2.配置完后重启系统:
exit  Ctrl+R
//3.使得配置生效
sudo ldconfig
//4.运行
./main.out

三. 交叉编译wiringOP库

1. 修改build.sh脚本,在echo “WiringPi Library” 之前添加以下内容,创建用于存放生成的头文件和库文件的文件夹:
  mkdir -p $PWD/_install/usr/local/bin
  mkdir -p $PWD/_install/usr/local/include
  mkdir -p $PWD/_install/usr/local/lib
2. 修改devLib/Makefile、gpio/Makefile、wiringPiD/Makefile、wiringPi/Makefile
将所有Makefile中的CC := gcc 改成 CC := aarch64-none-linux-gnu-gcc

3. 修改devLib/Makefile、gpio/Makefile、wiringPiD/Makefile 、wiringPi/Makefile,目的是使编译生成的文件都保存在_install / usr
修改DESTDIR?=/usr 替换为DESTDIR?=$(shell pwd)/../_install/usr
4. 修改wiringPi/Makefile
将$Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION)	$(DESTDIR)/lib/libwiringPi.so修改为:$Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION)	$(DESTDIR)$(PREFIX)/lib/libwiringPi.so
5.修改devLib/Makefile
将$Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION)
$(DESTDIR)/lib/libwiringPiDev.so修改为:$Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION)	$(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so
 6.devLib/Makefile,链接交叉编译时所需要的头文件
INCLUDE = -I. 修改为INCLUDE = -I. -I$(DESTDIR)$(PREFIX)/include
7.开始执行,这时候,就会wiringOP-master下生成_INSTALL目录,里面有完整编译出来的库文件和头文件
./build
 8. 打包成压缩包
tar -zcvf _INSTALL.tar.gz _install
9. 使用scp传输文件到香橙派
scp _INSTALL.tar.gz orangepi@192.168.144.202:/home/orangepi
10.进行解压
tar -zxvf _INSTALL.tar.gz
11.将_install里的内容拷贝到香橙派的根目录下
sudo cp * / -af
12.帮助系统更新共享库缓存,以便动态链接器能够正确地定位和加载这些共享库文件。
sudo ldconfig
13.然后就可以使用该库了
sudo gpio readall

三.智能垃圾桶交叉编译

1.调整项目的结构为:
├──inc
│
    ├──garbage.h
│
    ├──myoled.h
│
    ├──pwm.h
│
    ├──socket.h
│
    └──uartTool.h
├──src
│
    ├──garbage.c
│
    ├──garbage.py
│
    ├──main.c
│
    ├──myoled.c
│
    ├──pwm.c
│
    ├──socket.c
│
    └──uartTool.c
|
2.增加3rd目录,用于存放wiringOP和python3.10等第三方依赖库和头文件。
首先,从香橙派上利用apt download下载依赖包的头文件和库文件,并拷贝到宿主机里:
apt download zliblg zliblg-dev libpython3.10 libpython3.10-dev libexpatl libexpatl-dev libcryptl libcrypt-dev
scp *deb mi@192.168.81.39:/home/mi
3. 解压到/home/mi/Desktop/Class/3rd/下
dpkg -x libcrypt1_1%3a4.4.27-1_arm64.deb /home/mi/Desktop/Class/3rd/
dpkg -x libcrypt-dev_1%3a4.4.27-1_arm64.deb /home/mi/Desktop/Class/3rd/
dpkg -x libexpat1_2.4.7-1ubuntu0.3_arm64.deb /home/mi/Desktop/Class/3rd/
dpkg -x libexpat1-dev_2.4.7-1ubuntu0.3_arm64.deb /home/mi/Desktop/Class/3rd/
dpkg -x libpython3.10_3.10.12-1~22.04.3_arm64.deb /home/mi/Desktop/Class/3rd/
dpkg -x libpython3.10-dev_3.10.12-1~22.04.3_arm64.deb /home/mi/Desktop/Class/3rd/
dpkg -x zlib1g_1%3a1.2.11.dfsg-2ubuntu9.2_arm64.deb /home/mi/Desktop/Class/3rd/
dpkg -x zlib1g-dev_1%3a1.2.11.dfsg-2ubuntu9.2_arm64.deb /home/mi/Desktop/Class/3rd/
4. 编写Makefile
CC := aarch64-none-linux-gnu-gcc
SRC := $(shell find src -name "*.c")
#包含了需要引用的头文件路径
INC := ./inc \
	   ./3rd/usr/local/include \
	   ./3rd/usr/include \
	   ./3rd/usr/include/python3.10 \
	   ./3rd/usr/include/aarch64-linux-gnu/python3.10 \
	   ./3rd/usr/include/aarch64-linux-gnu \

#根据 SRC 变量中的 .c 文件生成对应的 .o 目标文件
OBJ := $(subst src/,obj/,$(SRC:.c=.o))
#最终生成的目标文件
TARGET := obj/garbage
#将 INC 中包含的路径添加到编译器的头文件搜索路径中
CFLAGS := $(foreach item, $(INC), -I$(item))
#包含了需要链接的库文件路径
LIBS_PATH := ./3rd/usr/local/lib \
			 ./3rd/lib/aarch64-linux-gnu \
			 ./3rd/usr/lib/aarch64-linux-gnu \
			 ./3rd/usr/lib/python3.10
#将 LIBS_PATH 中包含的路径添加到链接器的库文件搜索路径中
LDFLAGS := $(foreach item, $(LIBS_PATH), -L$(item))
#指定需要链接的库文件
LIBS := -lwiringPi -lpython3.10 -pthread -lexpat -lz -lcrypt

obj/%.o: src/%.c
	mkdir -p obj
	$(CC) -o $@ -c $< $(CFLAGS)

#将所有的目标文件链接在一起生成 garbage 文件
$(TARGET): $(OBJ)
	$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) $(LIBS)

compile: $(TARGET)

clean:
	rm $(TARGET) obj $(OBJ) -rf

debug:
	@echo $(CC)
	@echo $(SRC)
	@echo $(INC)
	@echo $(OBJ)
	@echo $(TARGET)
	@echo $(CFLAGS)
	@echo $(LDFLAGS)
	@echo $(LIBS)

.PHONY: clean compile debug
5. 进行编译,但是此时出现错误

错误1:我们的交叉编译工具可能版本太落后无法连接那些库和头文件,因此我们需要下载新的交叉编译工具,宿主机上安装aarch64-linux-gnu-gc 11.2版本并使用该交叉编译工具:

sudo apt install gcc-aarch64-linux-gnu

错误2:dpkg解压后有可能指定目录下只解压了软连接但并没有正确的建立软链接,所以我们需要手动进行软链接。 

//进入到未正确进行软链接的目录下
cd ~/Desktop/Class/3rd/lib/aarch64-linux-gnu
//手动进行软链接
ln -s libcrypt.so.1.1.0 libcrypt.so
ln -s libz.so.1.2.11 libz.so
ln -s libexpat.so.1.8.7 libexpat.so
6. 进行编译
make
7. 发送编译生成的garbage到orangepi

 

 

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

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

相关文章

Colab/PyTorch - 004 Torchvision Semantic Segmentation

Colab/PyTorch - 004 Torchvision Semantic Segmentation 1. 源由2. 语义分割 - 应用2.1 自动驾驶2.2 面部分割2.3 室内物体分割2.4 地理遥感 3. 语义分割 - torchvision3.1 FCN 使用 ResNet-101 语义分割3.1.1 加载模型3.1.2 加载图像3.1.3 预处理图像3.1.4 网络的前向传播3.1…

红酒与美食的完善搭配艺术

在美食的世界里&#xff0c;红酒总是扮演着不可或缺的角色。它与美食的搭配&#xff0c;是一门深奥的艺术。云仓酒庄雷盛红酒&#xff0c;作为一款备受欢迎的红酒品牌&#xff0c;以其卓着的品质和丰富的口感&#xff0c;成为了红酒与美食搭配的典范。 雷盛红酒&#xff0c;源…

中国农业大学:学硕11408复试线上涨40分,今年还会持续涨吗?中国农业大学计算机考研考情分析!

中国农业大学&#xff08;China Agricultural University&#xff09;&#xff0c;简称“中国农大”&#xff0c;坐落于中国首都北京&#xff0c;由中华人民共和国教育部直属&#xff0c;中央直管副部级建制&#xff0c;水利部、农业部和北京市共建&#xff0c;位列国家“双一流…

CNN卷积神经网络初学

1.为什么要学CNN 在传统神经网络中&#xff0c;我们要识别下图红色框中的图像时&#xff0c;我们很可能识别不出来&#xff0c;因为这六张图的位置都不通&#xff0c;计算机无法分辨出他们其实是一种形状或物体。 这是传统的神经网络图&#xff0c;通过权重调整神经元和神经元…

云曦实验室期中考核题

Web_SINGIN 解题&#xff1a; 点击打开环境&#xff0c;得 查看源代码&#xff0c;得 点开下面的超链接&#xff0c;得 看到一串base64编码&#xff0c;解码得flag 简简单单的文件上传 解题&#xff1a; 点击打开环境&#xff0c;得 可以看出这是一道文件上传的题目&#x…

智慧变电站守护者:TSINGSEE青犀AI视频智能管理系统引领行业革新

一、方案概述 随着科技的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;技术已经深入到各个领域。在变电站安全监控领域&#xff0c;引入AI视频监控智能分析系统&#xff0c;可以实现对站内环境、设备状态的实时监控与智能分析&#xff0c;从而提高变电站的安全运行…

(实测验证)【移远EC800M-CN 】GNSS功能打开和关闭关闭步骤验证

引言 本文章使用自研“超小体积TTL转4GGPS集成模块”进行实测验证&#xff1b; 一、打开GNSS功能 步骤一、通过 ATQGPSCFG 配置 GNSS 参数 &#xff08;1&#xff09;该命令用于查询和配置 GNSS 不同的设置&#xff0c;包括 NMEA 语句输出端口、NMEA 语句的输出类型等。 1.1…

【图神经网络——消息传递】

消息传递机制 画图先&#xff1a;导包&#xff1a;画图&#xff1a; 实现消息传递&#xff1a;例子一&#xff1a;例子二&#xff1a; 画图先&#xff1a; 导包&#xff1a; import networkx as nx import matplotlib.pyplot as plt import torch from torch_geometric.nn im…

基于Java的飞机大战游戏的设计与实现(论文 + 源码)

关于基于Java的飞机大战游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89313362 基于Java的飞机大战游戏的设计与实现 摘 要 现如今&#xff0c;随着智能手机的兴起与普及&#xff0c;加上4G&#xff08;the 4th Generation mobile communication &#x…

用友GRP-U8 bx_dj_check.jsp SQL注入漏洞复现(XVE-2024-10537)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

WebSocket or SSE?即时通讯的应用策略【送源码】

最近在研究H5推送&#xff0c;发现除了我们常用的WebSocket以外&#xff0c;其实还有一种协议也能实现H5推送&#xff0c;那就是SSE协议。 而且&#xff0c;当前主流的大模型平台&#xff0c;比如ChatGPT、通义千问、文心一言&#xff0c;对话时采用的就是SSE。 什么是SSE协议…

分布式系统的一致性与共识算法(三)

顺序一致性(Sequential Consistency) ZooKeeper 一种说法是ZooKeeper是最终一致性&#xff0c;因为由于多副本、以及保证大多数成功的ZAB协议&#xff0c;当一个客户端进程写入一个新值&#xff0c;另外一个客户端进程不能保证马上就能读到这个值&#xff0c;但是能保证最终能…

VB6连接各种类型的数据库

VB6连接各种类型的数据库 一、连接VFP数据库 Dim CNN As New ADODB.Connection Dim rssys As New ADODB.Recordset If CNN.state 1 Then CNN.Close CNN.ConnectionString "Driver{Microsoft Visual FoxPro Driver};SourceType.DBc;SourceDb" Trim(Text1) CNN…

掌握这些神器,让你的编程之路更加“丝滑”

前言&#xff1a; 在软件开发的旅程中&#xff0c;程序员的实用神器确实如同指南针&#xff0c;帮助他们在复杂的代码海洋中导航。以下是从三个方向——自动化测试工具、持续集成/持续部署&#xff08;CI/CD&#xff09;以及代码审查与质量分析——来探讨这些实用神器的应用和影…

Google Ads谷歌广告账户被封停怎么办?

跨境出海业务少不了需要做Google Ads推广业务&#xff1b;其中让投手们闻风丧胆的消息就是帐户被暂停。当 Google 检测到任何违反其政策且可能损害用户在线体验的行为时&#xff0c;就会发生这种情况。那么如何在做广告推广的同时&#xff0c;保证账号不被封禁呢&#xff1f;看…

如何向全国各大新闻网站投稿?

在信息爆炸的时代,新闻媒体的投稿工作对于单位的信息宣传员来说,既是一项重要的职责,也是一项充满挑战的任务。作为一名信息宣传员,我负责着单位的对外信息宣传投稿工作,每个月都需要在各大媒体上发表文章,以展示单位的成果和风采。 然而,刚开始的投稿之路并不顺畅。我习惯性地…

scp服务器之间相互传输文件命令

一、格式 scp -r 文件夹路径或者文件路径(绝对路径) 用户名ip地址:目标位置路径选项含义– h显示帮助文档-p尝试保留副本的修改时间和原文件的模式-x在主机之间传输加密所有信息-r如果原文件是目录&#xff0c;复制该目录中每个字树-D<端口>指定连接到远程主机上的端口-…

54.指针

目录 一.什么是指针&#xff1f; 二&#xff0e;定义一个指针变量 三&#xff0e;指针变量类型 四&#xff0e;取地址运算符& 五.取值运算符* 六.视频教程 一.什么是指针&#xff1f; 口语中的指针一般指指针变量&#xff0c;指针变量存放的是一个地址。普通变量存放…

大模型算法(一):从Transformer到ViT再到LLaMA

单任务/单领域模型 深度学习最早的研究集中在针对单个领域或者单个任务设计相应的模型。 对于CV计算机视觉领域&#xff0c;最常用的模型是CNN卷积模型。其中针对计算机视觉中的不同具体任务例如分类任务&#xff0c;目标检测任务&#xff0c;图像分割任务&#xff0c;以CNN作…

双向RNN和双向LSTM

双向RNN和双向LSTM 一、双向循环神经网络BiRNN 1、为什么要用BiRNN 双向RNN&#xff0c;即可以从过去的时间点获取记忆&#xff0c;又可以从未来的时间点获取信息,也就是说具有以下两个特点&#xff1a; 捕捉前后文信息&#xff1a;传统的单向 RNN 只能利用先前的上下文信息…