【Linux】交叉编译

Linux-交叉编译


前言

linux交叉编译学习过程中第一次遇到的玩意、学习前提悉知的知识点?
linux交叉编译实操——交叉编译wiringOP库
linux交叉编译wiringOP库学习过程中遇到的一些疑惑点?
linux交叉编译实操——交叉编译智能分类项目


1.aarch64-none-linux-gnu-gcc是什么东西?

aarch64-none-linux-gnu-gcc 是一个交叉编译工具链,用于在其他架构的系统(通常是 x86_64 架构的计算机)上编译 64 位 ARM 架构的程序 例如在 x86 架构的 PC 上编译出能运行在 ARM 架构的嵌入式设备上的程序。它基于 GCC(GNU Compiler Collection)编译器。

2.为什么叫交叉编译工具链?

2.1为什么叫工具链?

为什么叫工具链?在计算机科学中,“工具链”一词通常指的是一组按照特定顺序执行的工具,它们共同完成一个复杂的任务。

对于编译过程来说,通常包括以下几个步骤:
预处理:对源代码进行文本替换,例如包含头文件、宏展开等。
编译:将预处理后的代码编译为汇编语言或中间代码。
汇编:将汇编语言或中间代码转换为机器语言的目标文件。
链接:将目标文件和所需的库链接在一起,生成最终的可执行文件。

这些步骤通常由不同的工具来完成,例如编译器、汇编器、链接器等。当这些工具按照正确的顺序和配置组合在一起时,就形成了一个“工具链”

2.2为什么叫交叉编译?

它被称为“交叉编译工具链”是因为它涉及了两种不同的平台:编译平台(宿主机)和目标平台(目标机)。
开发者在宿主机上使用这个工具链编译代码,生成的程序可以在目标机上运行。这个过程就像是在两个不同的平台之间“交叉”工作,因此得名为“交叉编译工具链”。

一、交叉编译wiringOP库的配置过程解释(对照文档的实现过程)

主要讲述了如何使用交叉编译工具链来编译 wiringOP 库,并将其安装到目标设备上。下面我会用通俗的语言解释每一步的作用,并做出相应的解释。

1. 修改 build.sh 脚本

echo "WiringPi Library" 之前添加以下代码,用于创建一些目录:

mkdir $PWD/_INSTALL/usr/local/bin -p
mkdir $PWD/_INSTALL/usr/local/include -p
mkdir $PWD/_INSTALL/usr/local/lib -p

这些目录将用于存放编译后的库文件和头文件。

2. 修改 Makefile

修改 CC 变量

将所有 Makefile 中的 CC := gcc 改成 CC := aarch64-none-linux-gnu-gcc
这是因为我们使用交叉编译工具链来编译库文件,而不是直接在目标设备上编译。

修改 DESTDIR 变量

DESTDIR?=/usr 替换为 DESTDIR?= $(shell pwd)/../_INSTALL/usr
这样可以指定编译后的库文件和头文件的安装路径。

3. 修改 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

4. 修改 devLib/Makefile

同上,修改 devLib/Makefile 中的符号链接,使其指向正确的路径。

5. 修改 INCLUDE 变量

INCLUDE = -I. 修改为 INCLUDE = -I. -I$(DESTDIR)$(PREFIX)/include
以确保在编译时包含正确的头文件路径。

6. 执行编译命令

执行 ./build 命令来编译库文件。在选择板子时,输入 26,选择 orangepizero2

7. 检查生成的文件

wiringOP-master 目录下会生成一个 _INSTALL 目录,里面包含了编译好的库文件和头文件。

8. 将文件拷贝到目标设备

_INSTALL 目录中的内容拷贝到目标设备(香橙派)的根目录下。

9. 更新创建 符号链接(软链)

因为前面已经修改了几个文件的符号链接(软链),所以在目标设备(香橙派)上执行 sudo ldconfig 命令更新一下符号链接(软链)。

sudo ldconfig 是一个命令,用于更新系统的动态链接库缓存。在将编译好的库文件和头文件拷贝到香橙派的根目录后,需要运行这个命令来更新系统的动态链接库缓存(ldconfig 命令会扫描指定目录中的动态库文件,并将它们的信息添加到系统的动态链接库缓存中),这样,当其他程序需要使用这些库文件时,系统能够快速找到并加载它们。

10. 测试库是否链接正常

在目标设备上执行 sudo gpio readall 命令,以测试库是否链接正常。

10.1 为什么测试 wiringPi 库是否正确链接要用 sudo gpio readall 命令?

因为 gpio readall 命令就是 wiringPi 库提供的一个命令行工具,这个命令用来读取树莓派或其他单板计算机(香橙派)GPIO 引脚状态的,
那我们在安装和配置好 wiringPi 库后,运行 sudo gpio readall,如果命令能够正确输出每个引脚的状态,那么说明 wiringPi 库已经正确链接并能够正常工作。

通过以上步骤,我们就可以使用交叉编译工具链来编译 wiringOP 库,并将其安装到目标设备上,以便在目标设备上使用该库进行开发。

(一)疑问点

1. 为什么只修改这三个文件?wiringPi/MakefiledevLib/MakefileINCLUDE 变量

在嵌入式开发中,像香橙派这样的单板计算机,需要构建特定的库来提供对硬件的控制。wiringPidevLib 是两个常用的库。

总结

  • wiringPi 库提供了对 GPIO 引脚的简单易用的访问,适用于各种硬件控制任务。
  • devLib扩展了 wiringPi 的功能,提供了对特定设备或项目需求的支持。
  • INCLUDE 定义在 Makefile 文件中,用于指定编译时包含的头文件路径,以确保编译器找到所需的头文件。
  • 只构建这两个库是因为它们提供了项目所需的所有硬件访问和控制功能。

1.1 wiringPi

wiringPi 是一个用于树莓派的 GPIO(通用输入输出)访问库,也适用于其他类似的单板计算机,如香橙派。它提供了一组简单易用的函数,用于设置和读取 GPIO 引脚的状态,控制 LED、传感器和其他外设。

  • 作用wiringPi 库的主要作用是简化 GPIO 操作,使得开发者可以使用 API 进行硬件控制,而无需直接处理底层的硬件寄存器。这对于快速原型开发特别有用。

1.2 devLib

devLib 是一个与 wiringPi 相关的库,提供了额外的设备支持或特定的功能。它包含一些特定硬件或项目需求的自定义代码和函数。

  • 作用devLib 库的作用是扩展 wiringPi 的功能,提供对特定设备或应用场景的支持。它使得开发者可以轻松地集成自定义的硬件或实现特定的项目需求,而无需从头开始编写所有代码。

1.3 INCLUDE 变量

INCLUDE 变量是一个在 Makefile 文件中定义的变量,用于指定编译时包含的头文件路径。它通常在编译命令中使用,以确保编译器能够找到所需的头文件。

2. 为什么只构建这两个库?

  • wiringPi 库提供了对 GPIO 引脚的简单易用的访问,适用于各种硬件控制任务。
  • devLib扩展了 wiringPi 的功能,提供了对特定设备或项目需求的支持。
  • 只构建这两个库是因为它们提供了项目所需的所有硬件访问和控制功能。

3. 他们四个之间又是啥关系? build.shwiringPi/MakefiledevLib/MakefileINCLUDE 变量

关系总结

  • build.sh 脚本调用 Makefile 文件中的规则来执行编译和构建任务。
  • devLib/MakefilewiringPi/Makefile 包含了构建 wiringPidevLib 库的 所需得Makefile规则构建文件。
  • INCLUDE 变量在 Makefile 文件中定义,用于指定编译时包含的头文件路径。

2.1 build.sh

build.sh 是一个 shell 脚本,用于自动化编译和构建库文件的过程。它会调用 Makefile 文件中的规则来执行具体的编译和构建任务。

2.2 devLib/MakefilewiringPi/Makefile

devLib/MakefilewiringPi/Makefile 是具体到 devLibwiringPi 库的构建文件。它们是 Makefile 文件,包含了与 devLibwiringPi 库相关的编译和构建规则。

2.3 INCLUDE 变量

INCLUDE 变量是一个在 Makefile 文件中定义的变量,用于指定编译时包含的头文件路径。它通常在编译命令中使用,以确保编译器能够找到所需的头文件。

4. INCLUDE = -I. -I$(DESTDIR)$(PREFIX)/include 是什么意思?

INCLUDE 变量用于指定编译时包含的头文件路径。
在 Makefile 中,-I 选项用于指定头文件的搜索路径。
因此,-I 加一个. 表示在当前目录中搜索头文件,
-I$(DESTDIR)$(PREFIX)/include 表示在由 DESTDIRPREFIX 变量指定的目录中搜索头文件。

INCLUDE = -I. 修改为 INCLUDE = -I. -I$(DESTDIR)$(PREFIX)/include。这一步多添加了一个新的头文件搜索路径

5. 修改的路径是干嘛呢?

例如,将:
$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

这个路径是我们创建出来的临时目录,在交叉编译项目的时候,临时放一些库文件和头文件。

6. $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION)$(DESTDIR)$(PREFIX)/lib/libwiringPi.so 的区别

6. 为什么不直接写其中一条路径,而是要写两条路径,例如:

修改后是:
$Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPi.so

为什么不直接写这一条:
 $Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值