编译过程:
在程序开发中,使用高级语言编写的代码被称为源代码,比如用C语言编写的后缀名为.c的文件,或者C++编写的后缀名为.cpp的文件。源代码不能被机器执行,必须转换成二进制的机器代码(指令+数据)才能被CPU执行。将源代码转换成机器代码的过程称为编译(Compile),编译的工作需要编译器(Complier)来完成。
编译器对源代码进行语法检查,只有没有语法错误的源代码才能被编译通过。源代码经过编译后,并没有生成最终的可执行文件,而是生成一种被称为目标文件(Object File)的中间文件。比如,Visual C++的目标文件后缀名为.obj,而GCC的目标文件后缀名为.o
源代码可能包含多个源文件,比如main.c/fun1.c/fun2.c等等,编译器会对源文件逐个进行编译。因此,有几个源文件,就会生成几个目标文件;目标文件并不能被执行,因为它可能存在一些问题,比如源文件之间的引用关系导致的问题。
举个例子:文件A.c引用了文件B.c中的变量"EXT_someflag",A.c和B.c分别编译生成A.o和B.o,A.o中并没有变量"EXT_someflag"的定义,必须依靠B.o才能形成完整的代码。
把经过编译后生成的目标文件,按照其内在引用关系彼此相连接而生成一个完整的、可执行的文件的过程称为链接,链接工作由链接器完成。
因此,源文件生成可执行文件要经过编译和链接两个步骤才能完成。为了方便,我们也把这个过程统称为编译。
本地编译:
“本地编译”(通常称编译),是指编译源代码的平台和执行源代码编译后程序的平台是同一个平台(是在一个平台上生成在该平台上的可执行代码)这里的平台,可以理解为CPU架构+操作系统。比如,在Intel x86架构/Windows 10平台下、使用Visual C++编译生成的可执行文件,在同样的Intel x86架构/Windows 10下运行。
交叉编译:
交叉编译是在一个平台上生成另一个平台上的可执行代码。 比如:我们在windows上面编写C51代码,并编译成可执行代码,如xx.hex,是在c51上面运行,不是在windows上面运行。 我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行,不是在ubuntu linux上面运行。
CPU架构:比如ARM,x86,MIPS等等;
为什么要进行交叉编译?
- 有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征。
- 有时是因为目的平台上资源贫乏,无法运行我们所需要的编译器。
- 有时是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
操作系统也是代码,也需要编译,平台运行至少需要两个东西,bootloader(启动引导程序)以及操作系统核心。
宿主机(host):编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
目标机(target):用户开发的系统,通常都是基于非X86平台。host编译得到的可执行代码在target上运行。
交叉编译工具:
交叉编译需要使用交叉编译器、交叉编译工具链。
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下:
- 在Windows PC上,利用ADS(ARM开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。
- 在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
- 在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。
交叉编译工具链安装:Raspberry Pi · GitHub
下载完成之后放入共享内存文件夹,然后在linux中使用cd /mnt/hgfs/sharefromwindow进入共享文件夹查看,退出到工作目录,使用mkdir指令创建一个文件夹,进入文件夹,使用cp /mnt/hgfs/sharefromwindow/tools-master.zip .指令把文件复制到当前文件夹,使用unzip进行解压,解压后使用cd tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/在当前文件路径地下有一个arm-linux-gnueabihf-gcc即是类似gcc的一个编译文件,而且是一个软连接。
配置环境变量:
临时有效:
当关闭当前窗口之后,再打开一个窗口之前配置的环境变量就没了 PATH环境变量 export PATH=$PATH:/home/ksw/SYSTEM/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin(动态库所在位置)
永久有效: 修改工作目录下的.bashrc (这个文件主要保存个人的一些个性化设置,如命令别名、路径等)隐藏文件,配置命令终端的(当你每次启动终端时,系统都会自动执行一个叫做 .bashrc
的文件) 在文件最后一行加入:export PATH=“$PATH:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin”
source /home/CLC/.bashrc 加载配置文件,马上生效配置。
source命令通常用于重新执行刚修改的初始化文件,使之立即生效。