当前位置: 代码网 > 服务器>服务器>Linux > Linux交叉编译

Linux交叉编译

2024年08月06日 Linux 我要评论
vi .bashrc最后面添加。

目录

一. 下载交叉编译工具

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.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目录,里面有完整编译出来的库文件和头文件
./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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com