一个C/C++文件要经过预处理(preprocessing),编译(compilation),汇编(assembly),连接(linking)4部才能变成可执行文件,在windows的IDE中只需要点下按钮就能完成以上所有的工作,在Linux下则需要自己编写makefile通过make命令来完成。
1.预处理
在C/C++源文件中,以#开头的命令被称为预处理命令,预处理就是要将包含(include)的文件插入源文件中,将宏定义(define)展开,根据条件编译命令(if,ifdef)选择要使用的代码,最后将这些代码输出到一个 .i文件中。
预处理用到arm-linux-cpp工具。
2、编译
编译就是把上边的 .i文件翻译成汇编代码,用到的工具是cc1
3、汇编
汇编就是将上边的汇编代码翻译成机器代码,在Linux上是ELF目标文件(OBJ文件),反汇编就是倒过来,把机器码变为汇编。 这一步用到的工具是arm-linux-as
4、连接
这一步就是将上步生成的OBJ文件和系统库的OBJ文件、库文件连接起来,最终生成可以在特定平台上运行的可执行文件,工具为arm-linux-ld
有了以上的基础就可以来研究下makefile了,Linux中使用make命令来编译程序,而make所执行的动作就是依赖于makefile了,入门C程序helloworld.c的makefile如下:
1、 helloworld:helloworld.c
2、 gcc -o helloworld helloworld.c
3、 clean:
4、 rm -f helloworld
将上面4行存入makefile文件,放入对应的目录下,直接执行make就可编译helloworld程序,若执行make clean就可清除编译出来的东西,要是修改过某些文件,make命令可知道修改过的文件,从而再次编译时只编译修改过的文件,和IDE的修改后编译一样。
makefile的规则:
目标(target)... : 依赖(prerequiries)...
<制表符tab>命令(command)
目标:要生成的文件,如OBJ文件,也可以是一个动作,如上边才clean。
依赖:用来生成目标的文件,如源文件,一个目标经常会有几个依赖。
命令:生成目标是执行的动作,一个规则可以含有几个命令,每个命令占一行,前必有一个tab,不能用空格
对照上边最简单的那个makefile可看出 有2个目标helloword和clean,前者是个要生成的目标文件,后者是一个动作没有依赖,当依赖发生变动时,执行make后就会执行
gcc -o helloworld helloworld.c ,否则不会执行,当没有依赖时,就会强制执行,也就是只要make,必回执行clean下面的 rm -f helloword.