Linux 学习 C语言编译流程 Makefile

GCC编译流程 --  C语言编译

1 . 预处理阶段

  gcc -E -o hello.i hello.c

  这句命令 其中 hello.i  是 hello.c 预编译处理后的文件,预处理之后,会把hello.h 的内容插入到 hello.i 文件中

2 . 编译阶段

  GCC 首先要检查代码的规范性,是否有语法错误等,以确定代码实际要做的工作,在检查无误后,就开始把代码翻译成汇编语言。其中,GCC 的选项

  gcc -S hello.c -o hello.s  ( -S 不能小写)

  其中hello.s 就是汇编语言原始程序了

3 . 汇编阶段

  汇编阶段是把编译阶段生成的 .s 文件生成目标文件,在此使用选项 -c 就可以看到汇编代码已转换为 .o 的二进制代码

  gcc -c hello.c -o hello.o

4 . 链接阶段

  这里涉及一个重要的概念: 函数库

  比如你是用到了 "printf" 函数,但是程序中并没有这个函数的实现,同时 "stdio.h" 中也只有该函数的声明,并没有函数的定义,所以有一个问题,它是怎么实现的呢?

  说明,系统把这些函数实现都已经放入名为 "libc.so.6" 的库文件中去了。在没有特别指定时,GCC会到系统默认的搜索路径 "/usr/lib" 下进行查找,这样就能实现函数 "printf" 了,而这也就是链接的作用。

  gcc hello.o -o hello

  ./hello

  这样一个编译过程就完成了

 

make 工程管理器

make 是一个自动编译管理器,能够根据文件时间戳自动发现更新过的文件从而减少编译的工作量。

(在Makefile 中的每一个command 前都需要一个“Tab”符,否则在运行make命令时会出错)其中command 是创建每个目标体时需要运行的命令

 

例如:有两个文件分别为 "hello.c" "hello.h" , 希望创建的目标为 "hello.o" , 执行的命令为GCC编译指令 "gcc -c hello.c" ,那么,对应的Makefile 就可以写为以下形式。

  hello.o: hello.c hello.h

    gcc -c hello.c -o hello.o

上面代码只是加深题解,因为它过于简单。在实际中使用的Makefile往往包含很多命令,一个项目也会包含多个Makefile。

 

AR      库文件维护程序的名称,默认值ar

AS      汇编程序的名称,默认值as

CC      C编译器的名称,默认值为cc

CPP      C预编译器的名称,默认值为$(CC) -E

CXX      C++编译器的名称,默认值为g++

FC      FORTRAN 编译器的名称,默认值 f77

RM      文件删除程序的名称,默认值为rm-f

ARFLAGS   库文件维护程序的选项,无默认值

ASFLAGS   汇编程序的选项,无默认值  

CFLAGS     C编译器的选项,无默认值

CPPFLAGS   C预编译器的选项,无默认值

CXXFLAGS   C++编译器的选项,无默认值

FFLAGS      FORTRAN编译器的选项,无默认值

 

实例

有很多默认的命令,所以可以省略很多的命令,是代码简化

 

 

这个文件包含dlist.c student.c comm.c menu.c main.c

 

$* : 不包含扩展名的目标文件名称

 

$+ : 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复依赖文件

 

$< : 第一个依赖文件的名称

 

$? : 所有时间戳比目标文件晚的依赖文件,并以空格分开

 

$@ : 目标文件的完整名称

 

$^  : 所有不重复的依赖文件,以空格分开

 

$% : 如果目标是归档成员,则该变量表示目标的归档成员名称

 

posted @ 2020-09-04 13:16  李明亮  阅读(361)  评论(0)    收藏  举报