Linux交叉编译

目录

一. 下载交叉编译工具

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 zlib1g zlib1g-dev libpython3.10 libpython3.10-dev libexpat1 libexpat1-dev libcrypt1 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

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@尘音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值