Linux编译器-gcc 的使用以及 make/Makefile的用法
1.gcc是如何完成的1.预处理(进行宏替换)预处理功能主要包括宏定义,文件包含,条件编译,去注释等。预处理指令是以#号开头的代码行。实例: gcc –E hello.c –o hello.i选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。选项“-o”是指目标...
文章目录
一 ,gcc (编译器)
1. gcc 命令格式
格式 gcc [选项] 要编译的文件 [选项] [目标文件]
gcc选项
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S 编译到汇编语言不进行汇编和链接
-c 编译到目标代码
-o 文件输出到 文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w 不生成任何警告信息。
-Wall 生成所有警告信息。
2.完成过程
2.1预处理
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经
2.2 编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查
无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例:gcc –S hello.i –o hello.s
2.3 汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o
2.4 链接 (生成可执行文件)
在成功编译之后,就进入了链接阶段。
实例: gcc hello.o –o hello
二, make/Makefile
1.简单介绍
make 是命令
Makefile是文件
2.示例代码
#include<stdio.h>
int main()
{
//打印"hello Linux!"
printf("hello Linux!\n");
return 0;
}
Makefile 文件
3.原理
make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么,
- make会先在当前目录中找“Makefile”或“makefile”文件。
- 如果找到,它会找文件中的第一个目标文件(target),上面的例子中,他就会找到“hello”这个文件,把这个文件作为最终的目标文件。
- 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的修改时间比hello这个文件新,那么,他就会执行后面的命令来重写生成hello文件。
- 如果hello所依赖的hello.o文件不存在,那么make就会在当前的文件中找hello.o这一文件所依赖的关系和文件,来生成它。
5.hello.o 文件就是依赖于hello.h 和hello.c文件生成的。- 所以说makefile文件的依赖性很强,层层递进。
- 如果在层层寻找的过程中,找不到依赖文件,或者有未定义的语法,就会报错,然后退出。
- make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
4.项目清理
工程是需要被清理的
像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
可以将我们的 hello 目标文件声明成伪目标,测试一下
三 几种Makefile的常见写法
我就拿最简单的 Hello World 程序来说:
第一种:最简单的
第二种:
更多推荐
所有评论(0)