gcc 4步编译过程

一. gcc编译过程

 1. 预处理: 主要进行宏替换以及头文件的展开  gcc  -E   *.c  -o  *.i

2.  编译::编译生成汇编文件,会检查语法错误   gcc  -S   *.i   -o   *.s

3.  汇编:将汇编文件编译生成目标文件   gcc  -c   *.s   -o   *.o

4.  链接:链接库函数,生成可执行文件   gcc   *.o    -o   *

    gcc 编译参数:

      -c  生成目标文件

      -o  给生成的文件重名名

      -g  调试,必须添加这个参数才可以使用gdb调试

      -O  优化编译

      -O2  比O更好的优化

      -Wall 显示所有警告

 

二。 makefile自动编译

1.格式: 

目标:依赖

  规则    规则前有一个tab键 ,缺少tab键出错,使用空格替代也不可以

(1). 例子: 编写makefile 编译 main.c ,fun.c , fun.h

test:main.o fun.o
    gcc main.o fun.o -o test

fun.o:fun.c
    gcc -c fun.c -o fun.o
main.o:main.c
    gcc -c main.c -o main.o

.PHONY  #此行是防止,当前编译的目录下存在clean文件,不然报错
clean:
    rm *.o test

(2).  使用变量

# 使用变量代替比较长的编译工具名
CC=gcc
#使用变量代替较多的参数
CFLAGS=-c -Wall

test:main.o fun.o
    &(CC) main.o fun.o -o test

main.o:main.c
    $(CC) $(CFLAGS) main.c -o main.o
#    gcc -c main.c -o main.o -Wall    #不使用变量情况,使用变量时 用 $ 符取变量值

fun.o:fun.c
    &(CC) $(CFLAGS) fun.c -o fun.o

.PNOHY
clean:
    rm *.o test

  

(3). 自动变量
$*    不包含扩展名的目标文件名称
$+    所有的依赖文件,以空格分开,并且以出现的先后为序,可能包含重复的依赖文件
$<    第一个依赖文件的名称
$?     所有时间戳比目标文件晚的依赖文件,并以空格隔开
$@   目标文件的完整名称
$^     所有不重复的依赖文件,以空格隔开

CC=gcc
CFLAGS=-c -Wall

test:main.o fun.o
    $(CC) $^ -o $@  # $^ 所有不重复的依赖文件,以空格隔开

main.o:main.c
    $(CC) $(CFLAGS) $< -o $@  # $< 第一个依赖文件的名称,$@ 目标文件的完整名称
fun.o:fun.c
    $(CC) $(CFLAGS) fun.c -o fun.o

.PHONY
clean:
    rm *.o test

  

(4).  隐含规则

CC=gcc
CFLAGS=-c -Wall

# 隐含规则,注意目标文件必须是一个已存在的文件,下一行的规则没有,但需要tab键
main:mian.o fun.o   # 此处目标不能再写test了,必须是已存在的文件名
    

.PHONY
clean:
    rm *.o main

猜你喜欢

转载自www.cnblogs.com/electronic/p/10851453.html