交叉编译工具链的安装
不同平台用到的工具链不一样,这里以树莓派为例
首先去网址上下载安装包 Raspberry Pi · GitHub
将压缩包拷贝到Linux 工作目录下,解压压缩包 unzip tools-master.zip
切换到bin目录下,比如我的是
cd /home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
arm-linux-gnueabihf-gcc编译出来在树莓派执行的程序
然后需要做环境变量的配置,否则上面的命令不可用
临时有效 配置环境变量
echo $PATH 查看当前环境变量
获取当前目录(pwd)
export PATH = $PTAH /xxxx/xxx 添加环境变量 (当前环境变量路径到/games: 后面加上当前目录的路径)
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/raspberrypi/lessonPi/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
配置完成就可以在其它目录使用arm-linux-gnueabihf-gcc 命令了,但是因为是临时配置的环境变量,所以在其它终端不可用。
这里使用arm-linux-gnueabihf-gcc -v查看版本验证环境是否配置正确
换其它终端就找不到该命令
永久有效 配置环境变量
修改工作目录下的.bashrc 隐藏文件(配置命令终端的)
进入工作目录,编辑.bashrc 文件,在最后一行加入环境变量
source .bashrc 加载配置文件,马上生效配置。然后就可以在任何终端使用命令了。
交叉编译应用
编译:arm-linux-gnueabihf-gcc xxx -o xxx
把编译生成的可执行文件下载到开发板:
scp arm-clientPi pi@192.168.1.106:/home/pi/fromLinux
指令 文件名 开发板用户名@开发板地址:开发板的绝对路径
带wiringPi库的交叉编译
在Ubuntu安装wiringPi库
下载拷贝到Ubuntu,查看文件INSTALL
运行./build ,并查看目录/usr/local/lib
编译文件验证
没有包含头文件,查看wiringPi.h
再次编译链上文件的路径
链库编译
这里错误是因为安装的wiringPi库(是宿主机的平台)只适用于X86(arm-linux-gnueabihf-gcc不认识x86平台的库),链接的库的格式不对。
解决办法:直接把树莓派的wiringPi库拿来用
查看树莓派wiringPi库
拷贝到树莓派
注意,libwiringPi.so是软链接文件,在拷贝到Ubuntu后软链接消失,需要创建
创建软链接
ln -s 被链接的文件 软链接的文件
-s:建立软链接文件。如果不加 “-s” 选项,则建立硬链接文件;
-f:创建并覆盖。如果目标文件已经存在,则删除目标文件后再建立链接文件;
出现错误,无法创建软链接,文件已存在,解决办法,强制创建软链接
软链接创建完成后使用树莓派的wiringPi库在Ubuntu编译(-L指定动态库的搜索路径)生成在arm平台上的可执行程序
软链接和硬链接
软链接
当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在其它的目录下用ln命令链接(link)就可以,不必重复的占用磁盘空间。
特点:
1.软链接文件类似于Windows的快捷方式。
2.是一个特殊文件,在符号链接(软连接)中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
3.它只会你选定的位置上生成一个文件的镜像,不会占用磁盘空间
硬链接
硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个链接并不影响索引节点本身和其它的链接,只有当最后一个链接被删除后,文件的数据块及目录的链接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除。
这里有两点要注意:
第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;
第二,ln的链接又软链接 和硬链接
两种,软链接就是ln -s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化