一、什么是交叉编译
二、为什么要交叉编译?
三、交叉编译要用到的工具(工具链、交叉编译器)
四、交叉编译工具链的安装
五、配置环境变量
六、交叉编译工具编译
七、带wiringPi库的交叉编译如何进行
八、软链接、硬链接
九、Linux创建链接命令 ln -s创建软链接
一、什么是交叉编译
交叉编译(cross compilation)是指在一种体系结构的计算机上生成另一种体系结构的可执行程序。这通常用于嵌入式系统、移动设备和其他资源受限的环境,其中目标平台与主机平台不同。
以下是交叉编译的一般步骤:
-
获取交叉编译工具链: 你需要下载适用于目标平台的交叉编译工具链。这个工具链包含了编译器、链接器和其他必要的工具,使你能够在主机上生成目标平台的可执行文件。通常,工具链的名称包含目标体系结构的信息,例如
arm-linux-gnueabi
。 -
设置环境变量: 在使用交叉编译工具链之前,你需要设置一些环境变量,以确保编译器和其他工具正确地识别目标平台。例如,你可能需要设置
PATH
、CC
(C编译器)、CXX
(C++编译器)等环境变量。export PATH=/path/to/cross-compiler/bin:$PATH export CC=arm-linux-gnueabi-gcc export CXX=arm-linux-gnueabi-g++
-
配置项目: 修改项目的配置,以便使用交叉编译工具链。这通常涉及到使用
./configure
脚本或CMake等工具,并指定交叉编译工具链的路径。./configure --host=arm-linux-gnueabi
-
编译: 运行
make
命令,开始使用交叉编译工具链编译项目。make
-
生成可执行文件: 在编译完成后,你将得到目标平台上运行的可执行文件。
-
传输到目标平台: 将生成的可执行文件传输到目标平台上,可以使用
scp
、FTP等方式。 -
在目标平台上运行: 在目标平台上运行你的程序,确保它能够正确工作。
这是一个简单的概述。具体的步骤可能会根据项目和工具链的不同而有所调整。
交叉编译
交叉编译可以理解为:在当前编译平台上生成另一个目标平台上的可执行代码,但是编译平台本身却不能运行该程序。
比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。
本地编译
是指编译源代码的平台和执行源代码编译后程序的平台是同一个平台。
二、为什么要交叉编译?
交叉编译是指在一种操作系统上为另一种操作系统或架构生成可执行文件或库。以下是一些常见的原因和情景,为什么要使用交叉编译:
-
目标平台与开发平台不同: 当目标设备或平台与开发设备的架构或操作系统不同时,需要使用交叉编译。例如,在开发者的主机上使用 x86 架构和 Linux 操作系统进行开发,但目标设备是 ARM 架构的嵌入式设备,这就需要使用 ARM 架构的交叉编译工具链。
-
资源受限的嵌入式设备: 在嵌入式系统中,设备可能具有有限的计算资源,包括处理能力和内存。在这些情况下,使用嵌入式设备上的本地编译可能会非常慢,而使用更强大的开发主机进行交叉编译能够提高效率。
-
平台独立的开发: 有时,为了确保软件在多个平台上都能运行,开发者可能会选择使用交叉编译,以便生成适用于不同平台的二进制文件。
-
固定目标环境: 在一些情况下,特别是在嵌入式系统和嵌入式 Linux 中,目标环境可能是一个固定的硬件平台。使用交叉编译工具链可以更好地优化生成的二进制文件以适应目标硬件的特定需求。
-
系统软件开发: 在操作系统或底层系统软件的开发中,可能需要与特定架构或平台进行交互,这就需要使用交叉编译工具链。
总的来说,交叉编译是为了适应不同的硬件架构或操作系统,以确保软件能够在目标设备上正确运行。
(1) 交叉编译的目标系统一般都是内存较小、显示设备简陋甚至没有,没有能力在其上进行本地编译,无法运行我们所需要编译器;
(2) 有能力进行源代码编译的平台CPU架构
或操作系统与目标平台不同;
平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。
如:在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
三、交叉编译要用到的工具(工具链、交叉编译器)
在进行交叉编译时,通常需要使用一组特定于目标平台的工具。以下是一些常见的交叉编译工具:
-
交叉编译工具链: 包括交叉编译器(例如,arm-linux-gnueabi-gcc)、交叉汇编器(as)、交叉链接器(ld)等。这个工具链是特定于目标体系结构和操作系统的。
-
交叉编译的标准库: 在目标平台上运行的程序通常需要与目标平台的标准库进行链接。因此,交叉编译通常需要目标平台的 C 库、动态链接库等。
-
交叉调试器: 用于在目标平台上调试交叉编译生成的程序。例如,GDB(GNU Debugger)的交叉调试器版本。
-
交叉工具: 这包括一些辅助工具,例如 objcopy(用于从可执行文件中提取特定部分)、strip(用于删除可执行文件中的符号信息,减小文件大小)等。
-
构建工具: 为了简化交叉编译过程,构建工具如CMake和Autotools可能需要特定的配置,以支持交叉编译目标。
-
交叉目标文件系统: 如果您的应用程序依赖于目标平台上的文件系统,可能需要使用交叉编译的文件系统。
这些工具通常作为交叉编译工具链的一部分提供,可以通过交叉编译工具的发行版或硬件供应商的提供的工具链来获取。确保选择与目标平台和体系结构兼容的工具。
四、交叉编译工具链的安装
-
OrangePi_Zero2交叉编译工具链安装
详情参考OrangePi_Zero2用户手册Orange Pi Zero2-Orange Pi官网-香橙派(Orange Pi)开发板,开源硬件,开源软件,开源芯片,电脑键盘 -
树莓派交叉编译工具链安装
下载地址:https://github.com/raspberrypi/tools
-
解压
cp /mnt/hgfs/Share/tools-master.zip ./
unzip tools-master.zip 解压
cd /home/tan/raspberryPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
//gcc-linaro-arm-linux-gnueabihf-raspbian 32位
//gcc-linaro-arm-linux-gnueabihf-raspbian-x64 64位
arm-linux-gnueabihf-gcc ->arm-linux-gnueabihf-gcc-4.8.3
arm-linux-gnueabihf-gcc
是一个用于 ARM 架构的交叉编译器的符号链接。通常,这个链接会指向特定版本的编译器二进制文件,例如 arm-linux-gnueabihf-gcc-4.8.3
。
在交叉编译器的命名约定中,arm-linux-gnueabihf
表示了目标架构和操作系统(ARM,Linux,GNU 工具链,硬浮点支持)。而 gcc
后面的版本号,如 4.8.3
,表示编译器的版本。
通过创建符号链接,例如 arm-linux-gnueabihf-gcc
,可以使用户在使用交叉编译器时更加灵活。如果您的系统中有多个版本的交叉编译器,使用符号链接可以简化切换和配置。
如果需要确切知道 arm-linux-gnueabihf-gcc
符号链接指向哪个版本的编译器,可以使用 readlink
命令来查看链接目标。例如:
readlink -f $(which arm-linux-gnueabihf-gcc)
这将返回符号链接的实际目标文件的完整路径。
echo $PATH
获得当前环境变量的值
pwd获得当前路径
五、配置环境变量
1. 临时有效,配置环境变量
PATH 环境变量
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/tan/raspberryPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
2. 永久有效,配置环境变量,要改配置文件
修改工作目录下的 .bashrc
隐藏文件,配置命令终端的
vi /home/tan/.bashrc
在文件最后一行加入:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/tan/raspberryPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
source /home/tan/.bashrc 加载配置文件,马上生效配置。
六、交叉编译工具编译
file命令
file
命令用于确定文件类型。在终端中,你可以使用 file
命令并提供文件名或路径来获取文件的详细信息。例如:
file your_file
这将输出有关给定文件的信息,包括文件类型、编码方式、是否为文本文件等。
cannot execute binary file:Exec format error
无法执行二进制文件:Exec 格式错误
检查下交叉编译工具对不对:
arm-linux-gnueabihf-gcc -v
4.8.3
编译:
arm-linux-gnueabihf-gcc your_file.c -o your_file
把编译生成的可执行文件下载到开发板:
scp your_file pi@192.168.1.145:/home/pi
指令 文件名 开发板用户名@开发板IP:开发板的工作目录
七、带wiringPi库的交叉编译如何进行
PinnedWiringPi
masterWiringPi
-
正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的试试,链接库的格式也是正确的。
-
通过-I -L来指定
arm-linux-gnueabihf-gcc demo.c -I /home/tan/raspberryPI/WiringPi/wiringPi -L. -lwiringPi
把树莓派的wringPI库拿上来用
scp libwiringPi.so.2.50 tan@192.168.1.145:/home/tan/raspberryPI/
ln -s libwiringPi.so.2.50 libwiringPi.so
指令 参数 要被链接的文件 软链接文件名字
八、软链接、硬链接
软链接(Symbolic Link)和硬链接(Hard Link)都是用来创建文件系统中的链接的概念,但它们有一些区别。
-
软链接(Symbolic Link):
- 软链接是一个独立的文件,它包含了指向目标文件或目录的路径。
- 创建软链接使用
ln -s
命令,例如:ln -s /path/to/target link_name
。 - 软链接可以跨文件系统,并且可以链接到目录。
- 软链接可以指向不存在的目标。
-
硬链接(Hard Link):
- 硬链接是目录项(文件名)的不同名称,它们都指向同一个 inode 号的文件。
- 硬链接使用
ln
命令,例如:ln /path/to/target link_name
。 - 硬链接只能在同一文件系统中创建,不能链接到目录。
- 硬链接不能指向目录,并且不能链接到不存在的文件。
总的来说,软链接更加灵活,但是它们需要额外的空间来存储路径信息。硬链接更加节省空间,因为它们共享相同的 inode,但是在使用上有一些限制。
【硬链接】
硬链接指通过索引节点来进行链接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种链接就是硬链接。硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的链接。只删除一个链接并不影响索引节点本身和其它的链接,只有当最后一个链接被删除后,文件的数据块及目录的链接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除。
【软链接】
另外一种链接称之为符号链接(Symbolic Link),也叫软链接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号链接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
九、Linux创建链接命令 ln -s创建软链接
ln -s
是linux中一个非常重要命令,一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s
具体用法是:ln -s 源文件 目标文件。
当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的 目录下
用ln命令链接
(link)它就可以,不必重复的占用磁盘空间。例如:ln -s /bin/less /usr/local/bin/less
-s 是代号(symbolic)的意思。
这 里有两点要注意:第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;第二,ln的链接又软链接 和硬链接
两种,软链接就是
ln -s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还
是硬链接,文件都保持同步变化。
软链接:
- 概念:
1. 软链接文件有类似于Windows的快捷方式。
2. 在符号链接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
3. 你选定的位置上生成一个文件的镜像,不会占用磁盘空间
如何生成软链接:
ln -s libwiringPi.so.2.50 libwiringPi.so
指令 参数 要被链接的文件 软链接文件名字
硬链接:ln libwiringPi.so.2.50 libwiringPi.so
它会在你选定的位置上生成一个和源文件大小相同的文件
无论是软链接还是硬链接,文件都保持同步变化。