前言
交叉编译概念、安装、使用
一、交叉编译概念
交叉编译概念:是在一个平台上生成另一个平台上的可执行代码。
常见交叉编译例子:
1、在Windows PC上,利用ADS(ARM开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。
2、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
3、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。
为什么要交叉编译:
目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;
目的平台上的资源贫乏,无法运行我们所需要编译器;
目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
宿主机:编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
目标机:用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。
二、交叉编译工具链
1.下载安装
树莓派github中tool一栏,下载安装包,放到虚拟机的共享文件夹中
https://github.com/raspberrypi
在虚拟机中,先将共享文件夹中的安装包cp到工作目录下的文件夹,对其进行解压
unzip tools-master.zip
进入到bin文件夹
查看工具链是否可用(通过查看工具链的版本)
>./arm-linux-gnueabihf-gcc -v
2.使用
将其配置到环境变量中,不用每次使用arm-linux-gnueabihf-gcc时都进入到bin文件夹中
1>.临时有效,重新开启一个终端,便不可用
打印出此时的绝对路径
>pwd
/home/hekun/A-MYFILE/tool-master/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
修改环境变量
>export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/hekun/A-MYFILE/tool-master/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
切换文件夹,查看工具链是否可用(通过查看工具链的版本)
>arm-linux-gnueabihf-gcc -v
2>.永久有效
修改工作目录下的.bashrc 隐藏文件
>cd
>vi .bashrc
在其末尾加上
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/hekun/A-MYFILE/tool-master/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
保存退出后让其立即生效,即可在多个终端直接使用
>source .bashrc
三、带wiringPi的库的交叉编译,
正常来说,要先交叉编译wiringPi库,编译出的库适合树莓派,链接库的格式也是适合树莓派的的。
可以直接将树莓派的wringPI库拿过来用
在树莓派中
>cd /lib
>scp libwiringPi.so.2.52 hekun@192.168.1.108:~/A-MYFILE/recive
在虚拟机中生成软链接
>ln -s libwiringPi.so.2.52 libwiringPi.so
在虚拟机中生成树莓派上可执行的文件
>arm-linux-gnueabihf-gcc demo1.c -I /home/hekun/A-MYFILE/WiringPi/WiringPi/wiringPi -L /home/hekun/A-MYFILE/recive -lwiringPi
总结
1.平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心
2.修改环境变量也可以:export PATH = $PATH:XXX
PATH决定了shell到哪些目录里寻找命令或程序
env查看所有的环境变量,包括PATH,SHELL,HOME,LANGUGE等等
查看单个环境变量:echo $PTAH
export表示临时修改环境变量
长久有效需修改配置文件:/etc/profile是针对所有用户有效
~/.bashrc是针对当前用户有效
3.touch:创建新的空文件
4.file查看文件属性:查看可执行文件是在x86上还是在arm上运行
5.-I(大写i):指定寻找头文件的路径
-L:制定寻找库文件的路径
6.grep gcc* -nir:在当前文件夹中的所有文件中查找gcc n:显示行号,i:不区分大小写,r:递归查找
7.在虚拟机中使用scp指令时,出现以下报错:
解决方法:修改配置文件
>sudo vim /etc/ssh/ssh_config
在文件末尾添加
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
8.在树莓派中使用scp命令时,出现以下报错:
解决方法:打开虚拟机的22号端口
>sudo apt-get install openssh-server
>sudo apt-get install ufw
>sudo ufw enable
>sudo ufw allow 22
9.ubuntu下解压rar文件:
>sudo apt install rar //安装rar解压工具
>rar x test.rar //保持原来的目录结构解压
10.软链接:类似于Windows的快捷方式;文件实际上是一个文本文件,其中包含的有另一文件的位置信息;在选定的位置上生成一个文件的镜像,不会占用磁盘空间
硬链接:在选定的位置上生成一个和源文件大小相同的文件。硬连接的作用是允许一个文件拥有多个有效路径名,防止“误删”的功能。当对应该目录的索引节点有一个以上的连接,只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放
>ln -s libwiringPi.so.2.50 libwiringPi.so //生成软链接
>ln libwiringPi.so.2.50 libwiringPi.so //生成硬链接
11.scp指令:
>scp clientInPi pi@192.168.43.30:/home/pi
//指令 文件名 开发板用户名@开发板地址:文件发送到开发板的指定路径