一、交叉编译(交叉工具链)

在一个环境下编译生成一个可以在另一个环境中执行的可执行文件的工具

本地编译命令 gcc 实现把高级语言的C文件,翻译成二进制文件
是可以在虚拟机中找到的:
which gcc
用来查找命令位置的命令
若目标命令存在,则反馈目标命令的绝对路径
若目标命令不存在,则什么反馈都没有

交叉编译命令 实现把高级语言的C文件,翻译成二进制文件
首先需要安装交叉工具链,才能找到
因为最开始的镜像默认是没有交叉工具链

区别:执行的环境不一样
gcc属于本地编译命令,编译生成的文件是在虚拟机中执行的
交叉编译针对的是我们的开发板,因为我们的开发板是ARM

结论:在同一个平台上编译生成的可执行文件,可以在该平台上运行,
那么这个编译过程就称之为本地编译
在一个平台上编译生成的可执行文件,可以在另一个平台上运行,
那么这个编译过程就称之为交叉编译


安装交叉工具链:

1.先把工具链放到共享目录里
	arm-5.4.0.tar.gz
2.为你的工具链在虚拟机中新建一个目录,并给与权限
	sudo mkdir /usr/5.4.0_arm
	sudo chmod 777 /usr/5.4.0_arm
	*也可先进入/usr/目录,再进行操作
3.把工具链复制到刚创建的目录中,进行解压
	也可以直接解压工具链到刚创建的目录
	1>直接在共享目录中解压到目标目录,需要先切换到共享目录
	sudo tar zxvf arm-5.4.0.tar.gz -C /usr/5.4.0_arm
	2>先复制到创建的目录中,然后切换到新建目录中,直接解压
	sudo cp /mnt/hgfs/xxx/arm-5.4.0.tar.gz /usr/5.4.0_arm
					共享目录
	cd /usr/5.4.0_arm
	sudo tar zxvf arm-5.4.0.tar.gz

4.交叉工具链安装完毕之后,想要生效,需要设置交叉工具链相对应的命令和库能被找到
	既是需要把对应命令和库的存放位置,添加到环境变量中
	1>添加命令对应存储文件的位置
	export PATH=$PATH:/usr/5.4.0_arm/5.4.0/usr/bin
	2>添加库文件对应存储文件的位置
	export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/5.4.0_arm/5.4.0/usr/lib
	
	添加完命令和库路径之后,即可使用交叉编译工具,但是仅限于当前shell终端,其他中断仍无法使用

5.使交叉工具在所有shell终端生效
	原理:在每一个终端启动时,都去执行对应的命令和库文件的环境变量的添加声明
	找到shell启动时的配置的脚本文件
	~/.bashrc
	打开对应的脚本文件,把声明交叉编译命令和对应库的两句语句,添加到文件末尾
	
	操作步骤:
	gedit ~/.bashrc
	把下列两句话添加入文件末尾,然后保存,退出即可
	export PATH=$PATH:/usr/5.4.0_arm/5.4.0/usr/bin
	export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/5.4.0_arm/5.4.0/usr/lib
	重新运行终端的脚本文件
	source .bashrc
	验证
	which arm-linux-gcc
	若能查到对应则说明成功

6.本地编译和交叉编译的区别
	利用命令file查看文件属性
	1.file test			-->test由本地编译生成
	test: ELF 64-bit LSB shared object, x86-64
			64位的可执行文件			类型是x86-64
	2.file arm_test		-->arm_test由交叉编译生成
	arm_test: ELF 32-bit LSB executable, ARM
			32位的可执行文件			类型是ARM

开发板的使用:
1.安装ScurtCRT软件
解压SecureCRT.rar压缩包
进入解压目录找到对应的SecureCRT.exe文件,直接双击运行
若是第一次使用该软件,则安装时需要输入对应的许可信息
许可信息在“说明.txt”文档中
2.设置串口软件的参数
点击快速连接按钮
通信协议 serial
通信端口 COMx --》首先需要安装对应的转串口驱动,若无法区分,两个驱动都安装即可
查看对应的端口号:
右键此电脑(计算机)–》管理–》设备管理器–》查看端口–》查看对应转串口驱动的端口
波特率 115200
数据位 8
奇偶校验位 无(none)
停止位 1
数据流控制 全部关闭(不选择)

关闭开发板开机自启的物联网实验程序:
		打开开发板的/etc/profile文件
		vi /etc/profile
		按i,从命令模式切换到输入模式
		找到
		cd /IOT
		./iot
		在这两句命令之前加上注释符号#
		然后,按Esc切换到命令模式
		输入":wq",保存并退出文件
		
		**注意:一定不要弄成无线重启
		重新启动系统
		命令行输入命令:reboot

3.下载文件到开发板上
	1>利用串口命令rx进行下载
		输入命令:rx xxx(目标文件)		目标文件只能是普通文件,包括二进制文件、源文件、文本文件、、、
		回车							会进入等待传输
		点击串口软件的传输按钮-->
		-->选择发送XModem				进入文件浏览选择过程
		确认目标文件,下载即可
		
		正在开始 xmodem 传输。 按 Ctrl+C 取消。
		正在传输 test...
		  100%      16 KB    3 KB/s 00:00:05       0 错误

		因为第一次下载的文件是没有权限的,所以需要赋予目标文件权限,方可执行
		chmod 777 xxx(目标文件)
		
	2>利用串口命令rz进行下载	
		因为开发板上默认是没有rz命令的,所以需要先把命令下载到开发板
		先利用rx把rz下载到开发板的/bin/
		cd /bin/	进入开发板的/bin/目录
		rx rz		下载rz		下载命令
		rx sz		下载sz		上传命令
		下载完毕之后需要记得赋予执行权限
		
		使用方式:
		输入命令:rz -y,回车
		浏览选择需要下载的文件
		因为rz每一次都是删除对应文件之后,重新下载
		相当于每一次都是第一次下载
		所以每一次都需要重新赋予执行权限
		
		sz使用方式和rx一样,一次性只能上传一个指定文件,和rz不一样
		sz上传的文件所在的位置:
			SecurtCRT软件的菜单‘选项’-->‘会话选项’-->XModem/ZModem
			指定上传/下载目录的位置
	
	3>tftp服务器下载,利用的网络传输
		利用windows下的TFTP软件提供的服务
		若要使用tftp服务,首先需要保证网络畅通,局域网通信ok
		1.设置开发板的ip,使开发板和PC在同一局域网,并可通信
			ifconfig eth0 192.168.xxx.xxx
			注意先查看电脑IP
		2.启动tftp服务器
			直接双击运行tftp服务器软件即可
		3.选择tftp服务器的目标目录
			既是将要下载的文件所在的目录
		4.命令
			下载
			tftp -g -r xxx(目标文件) 192.168.xxx.xxx(PC端的IP)
			上传
			tftp -p -l xxx(目标文件) 192.168.xxx.xxx(PC端的IP)
		
		注意会出现的问题:
			1.网线连接成功,网口会闪烁,会打印出提示语句
				[ 4320.172000] PHY: stmmac-0:04 - Link is Up - 1000/Full
			2.IP的设置,PC和开发板一定要在同一网段
				既是IP的前3个数字一样
				验证网络是否通畅
				开发板和PC相互ping:
					ping 192.168.xxx.xxx	-->开发板pingPC,PCping开发板
					若网络通畅,会反馈信息
					64 bytes from 192.168.51.2: seq=0 ttl=128 time=1.701 ms
					64 bytes from 192.168.51.2: seq=1 ttl=128 time=1.426 ms
					64 bytes from 192.168.51.2: seq=2 ttl=128 time=1.500 ms
			3.因为tftp利用的网络,所以防火墙很可能会有问题
				需要把防火墙全部关掉
		
		因为ifconfig eth0 192.168.xxx.xxx设置的ip是临时的,时效是直到关机
		若想设置永久,需要把该命令写入开发板的启动配置文件的末尾
		既是开发板上的/etc/profile文件

开发板上的程序运行:
1.编辑源程序
2.编译命令选择的依赖,看接下来编译生成的可执行将要在哪里运行
虚拟机 本地编译命令
开发板 交叉编译命令
*3.若目标是开发板,则需要把目标下载到开发板上去执行
4.运行目标可执行程序