Linux交叉编译

目录

1、交叉编译初识

1.1 什么是交叉编译

1.2 为什么需要交叉编译

1.3 宿主机和目标机

 2、搭建交叉编译工作环境

2.1 安装工具链

2.2 配置环境变量

2.2.1 配置临时环境变量

2.2.2 配置永久环境变量

3、交叉编译宿主机与目标机实战

3.1 在Ubuntu上编写一个简单的程序:程序的文件名为:demo1.c

​3.2 宿主机编译生成的可执行文件下载到目标机(开发板)

4、带wiringPi库的交叉编译

4.1 将树莓派中自带的wiringPi库上传到宿主机中

4.2树莓派使用scp 拷贝libwiringPi.so.2.50时出现的问题解决

5、软链接和硬链接 

5.1 软链接

5.2 硬链接

6、带wiringPi库的软链接编译


1、交叉编译初识

1.1 什么是交叉编译

  •  编译:是在一个平台上生成在该平台上的可执行代码
  •  交叉编译:是在一个平台上生成另一个平台上的可执行代码。

● 我们在windows上面编写C51代码,并编译成可执行代码,如xx.hex,是在c51上面运行,不是在windows上面运行

● 我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行,不是在ubuntu linux上面运行的

1.2 为什么需要交叉编译

● 平台上不允许或不能够安装我们所需要的编译器比如C51;

● 因为目的平台上的资源贫乏,无法运行我们所需要编译器;

● 树莓派作为一款强大的开发板,同样也需要用到交叉编译。树莓派有时因为目的平台还没有建立,暂无操作系统,所以根本不能运行编译器。

● 操作系统也是代码,也要编译!
● 平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心。

1.3 宿主机和目标机

● 宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机(电脑X86)。
● 目标机(target)用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行(树莓派ARM)。

2、搭建交叉编译工作环境

2.1 安装工具链

工具链下载网址:https://github.com/raspberrypi/

Linux交叉编译_第1张图片

 Linux交叉编译_第2张图片

(1) 将下载好的工具链文件放入Windows与Ubuntu的共享文件夹中;

(2) 打开Ubuntu,从共享文件夹拷贝到工作目录。输入命令:

cp /mnt/hgfs/sharetoubantu/tools-master.zip .//我的共享文件名是sharetoubantu

(3) 解压文件: unzip tools-master.zip

(4) 进入解压好的文件目录中,依次进入如下目录直到bin目录(64位计算机按如下选择)

cd tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

(5)ls进入bin目录里,找到 arm-linux-gnueabihf-gcc (6)指令arm-linux-gnueabihf-gcc -v 检查交叉工具链是否是4.8.3版本

Linux交叉编译_第3张图片

2.2 配置环境变量

临时:只在当前页面有效,离开当前页面又需要重新配置;

永久:任何页面或路径下都有效。

(1)在上面操作交叉编译工具链可以看到,要使用工具链就必须进入层层目录,繁琐且麻烦,降低开发效率;

(2)配置环境变量就能很好的解决这一问题;

2.2.1 配置临时环境变量

(1) echo $PATH : 显示当前的环境变量;

(2) pwd :显示当前路径,并复制;

(3) export PATH= : 配置环境变量 = 红线部分 + 当前路径

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/wj/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

(4)回车确定,cd 回到工作目录

(5)   arm-linux-gnueabihf-gcc -v :检查

Linux交叉编译_第4张图片

2.2.2 配置永久环境变量

(1)修改工作目录下的.bashrc 隐藏文件,配置命令终端的vi /home/dhw/.bashrc 打开后在文本最后一行加入以下内容:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/wj/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

(2)source /home/dhw/.bashrc  加载配置文件,马上生效配置。

3、交叉编译宿主机与目标机实战

3.1 在Ubuntu上编写一个简单的程序:程序的文件名为:demo1.c

#include 

int main()
{  
    printf("Hello Wang!!!\n");

    return 0;
}

● 常规编译:gcc demo1.c -o test_1生成test_1这个可执行程序;

● 交叉编译:arm-linux-gnueabihf-gcc demo1.c -o test_2 。生成test_2这个可执行程序;

file命令分别查看可程序test_1和test_2的属性:

● test_1在x86-64位计算机上面运行(宿主机-电脑),无法在ARM平台上运行

● test_2在ARM平台上运行(目标机-树莓派),无法在X86平台上运行

3.2 宿主机编译生成的可执行文件下载到目标机(开发板)

scp test_2 [email protected]:/home/pi

指令 文件名 开发板用户名@开发板地址:开发板的绝对路径

此方法也可以将目标机文件传至宿主机

在目标机上会生成test_2文件然后将其进行编译运行即可。

4、带wiringPi库的交叉编译

说明:我们在树莓派中编写带wiringPi库的程序时(比如IO口),直接在程序中加头文件#include ,在编译的时候-l链接wiringPi库即可,因为树莓派自带有wiringPi库,在/usr/lib目录下。在Ubuntu中或者宿主机中没有自带wiringPi的库,那么很明显无法顺利完成带wiringPi库程序的交叉编译。

1 正常情况下我们要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的链接库的格式也是正确的。

2、由于链接库的格式不正确,是宿主机的平台,所以我们要用树莓派自带的wiringPi库。

4.1 将树莓派中自带的wiringPi库上传到宿主机中

(1)  cd /usr/lib  :树莓派wiringPi库的文件路径;

(2)ls -l |grep wiringPi :过滤出只有wiringPi库的相关文件

Linux交叉编译_第5张图片

(3)将软链接libwiringPi.so指向的libwiringPi.so.2.50下载到Ubuntu或宿主机中:

scp libwiringPi.so.2.50 [email protected]:/home/wj/lessonPI

4.2 树莓派使用scp 拷贝libwiringPi.so.2.50时出现的问题解决

  • ssh无法开启

 在使用ssh的时候发现不能用,包括scp远程拷贝也被拒绝

解决办法:输入如下指令:

sudo apt-get install openssh-server

Linux交叉编译_第6张图片

然后完成之后,ssh就可以正常工作了

 详情可参考博客:https://blog.csdn.net/admin_plmm/article/details/115037036?spm=1001.2014.3001.5502

注意这里要拷贝软连接指向的文件,如果直接拷贝软链接到Ubuntu,Ubuntu里并不会生成我们要的软链接。

那么需要自己来生成软链接!首先了解软硬链接的概念:

5、软链接和硬链接 

5.1 软链接

可参考博文:https://www.cnblogs.com/zhangna1998517/p/11347364.html

  • 软链接文件有类似于Windows的快捷方式。
  • 它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
  • 它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间

Linux交叉编译_第7张图片

5.2 硬链接

● 在选定的位置上生成一个和源文件大小相同的文件;

● 硬链接通过索引节点来进行链接;在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接

● 允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放,也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

生成方法:

ln libwiringPi.so.2.50 libwiringPi.so 
没有参数 -s

6、带wiringPi库的软链接编译

编译时通过-I -L来指定相关库的路径

● -I (注意是大写的i) 给gcc添加自定义的头文件的路径

● -L 给gcc添加额外的搜索库的路径

arm-linux-gnueabihf-gcc demo2.c -I /home/wj/lessonPI/WiringPi/wiringPi -L. -lwiringPi -o crossComBinDemo2
交叉编译工具链     树莓关于IO口文件   -I wiringPi库头文件路径             -L wiringPi库

编译通过:

你可能感兴趣的:(Linux入门,linux,服务器)