Linux-交叉编译
- 前言
- 1.aarch64-none-linux-gnu-gcc是什么东西?
- 2.为什么叫交叉编译工具链?
- 一、交叉编译wiringOP库的配置过程解释(对照文档的实现过程)
- (一)疑问点
-
- 1. 为什么只修改这三个文件?`wiringPi/Makefile` 、`devLib/Makefile`、 `INCLUDE` 变量
- 2. 为什么只构建这两个库?
- 3. 他们四个之间又是啥关系? `build.sh`、 `wiringPi/Makefile` 和 `devLib/Makefile`、 `INCLUDE 变量`
- 4. `INCLUDE = -I. -I$(DESTDIR)$(PREFIX)/include` 是什么意思?
- 5. 修改的路径是干嘛呢?
- 6. `$(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION)` 和 `$(DESTDIR)$(PREFIX)/lib/libwiringPi.so` 的区别
- 6. 为什么不直接写其中一条路径,而是要写两条路径,例如:
- 二、交叉编译 —— 智能分类项目 工程代码
前言
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/Makefile
、devLib/Makefile
、 INCLUDE
变量
在嵌入式开发中,像香橙派这样的单板计算机,需要构建特定的库来提供对硬件的控制。wiringPi
和 devLib
是两个常用的库。
总结
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.sh
、 wiringPi/Makefile
和 devLib/Makefile
、 INCLUDE 变量
关系总结
build.sh
脚本调用Makefile
文件中的规则来执行编译和构建任务。devLib/Makefile
和wiringPi/Makefile
包含了构建wiringPi
和devLib
库的 所需得Makefile规则构建文件。INCLUDE
变量在Makefile
文件中定义,用于指定编译时包含的头文件路径。
2.1 build.sh
build.sh
是一个 shell 脚本,用于自动化编译和构建库文件的过程。它会调用 Makefile
文件中的规则来执行具体的编译和构建任务。
2.2 devLib/Makefile
和 wiringPi/Makefile
devLib/Makefile
和 wiringPi/Makefile
是具体到 devLib
和 wiringPi
库的构建文件。它们是 Makefile
文件,包含了与 devLib
和 wiringPi
库相关的编译和构建规则。
2.3 INCLUDE 变量
INCLUDE
变量是一个在 Makefile
文件中定义的变量,用于指定编译时包含的头文件路径。它通常在编译命令中使用,以确保编译器能够找到所需的头文件。
4. INCLUDE = -I. -I$(DESTDIR)$(PREFIX)/include
是什么意思?
INCLUDE
变量用于指定编译时包含的头文件路径。
在 Makefile 中,-I
选项用于指定头文件的搜索路径。
因此,-I 加一个.
表示在当前目录中搜索头文件,
而 -I$(DESTDIR)$(PREFIX)/include
表示在由 DESTDIR
和 PREFIX
变量指定的目录中搜索头文件。
将 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