目录
一. 下载交叉编译工具
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脚本
如果是第一次运行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.要使用交叉编译工具链就必须进入层层目录,因此,需要配置环境变量。
最后面添加
- 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.96.202:/home/orangepi/Class/demo1
- scp main.out orangepi@192.168.96.202:/home/orangepi/Class/demo1
复制代码
远程连接进入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../build开始编译,发现出现错误,意思是软连接时目标路径不存在,需依次查看所有Makefile文件看谁进行了软连接,最后发现wiringPi/Makefile和devLib/Makefile软连接出错
修改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
复制代码
修改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
复制代码
5../build开始编译,发现出现错误,意思是piFace.c文件编译时找不到头文件wiringPi.h,最后发现piFace.c文件在devLib下,所以只需要修改devLib/Makefile
devLib/Makefile,链接交叉编译时所需要的头文件
- INCLUDE = -I. 修改为INCLUDE = -I. -I$(DESTDIR)$(PREFIX)/include
复制代码
7.开始执行,这时候,就会wiringOP-master下生成_INSTALL目录,里面有完整编译出来的库文件和头文件
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里的内容拷贝到香橙派的根目录下
12.帮助系统更新共享库缓存,以便动态链接器能够正确地定位和加载这些共享库文件。
13.然后就可以使用该库了
四.智能垃圾桶交叉编译
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. 进行编译
7. 发送编译生成的garbage到orangepi