gcc编译的过程
1.预处理,preprocess 把头文件和库文件展开,宏定义直接替换.
$ gcc -E main.c -o main.i
2.汇编,compile , 生成一个汇编代码文件
$ gcc -S main.i -o main.s
3.编译,assemble
$ gcc -c main.s -o main.o
4.链接,link
$ gcc main.o -o main
gcc编译常用命令
$ gcc mian.c -o mian
Makefile的使用
新建一个文本文档命名为Makefile
$ vim Makefile
为了便于演示和说明,已经新建了main.c add.c add.h 三个c语言文件
$ cat main.c
#include <stdio.h>
#include "add.h"
int main()
{
int a = 1 ;
int b = 2 ;
int sum ;
sum = addInt( a , b );
printf(" %d + %d = %d " , a , b ,sum );
return 0;
}
$ cat add.c
#include "add.h"
int addInt( int a , int b )
{
return a + b ;
}
$ c_pro cat add.h
#ifndef __ADD_H
#define __ADD_H
int addInt( int a , int b );
#endif
显示规则:
1. # 是注释
2. 目标文件 : 依赖文件
[TAB] 命令
3. 第一个目标文件是最终目标
4. 伪目标:
:PHONY :
clear :
rm -rf main.i main.o main
# this is a simple code about processing 1 + 2 and printing result .
main : main.o add.o
gcc main.o add.o -o main
main.o : main.s
gcc -c main.s -o main.o
main.s : main.i
gcc -S main.i -o main.s
main.i : main.c
gcc -E main.c -o main.i
add : add.o
gcc add.o -o add
add.o : add.s
gcc -c add.s -o add.o
add.s : add.i
gcc -S add.i -o add.s
add.i : add.c
gcc -E add.c -o add.i
.PHONY:
clear :
rm -rf add.i add.s add.o add.i add.s add.o
变量:
1. = :替换
2. += : 追加
3. := : 常量
4. 使用时用$(var)
$ cat Makefile
# this is a simple code about processing 1 + 2 and printing result .
# In order to compare with makefile above, only minor changes have been made here
G := gcc
TAR = main
OBJ= main.c
OBJ += add.c
$(TAR) : $(OBJ)
$(G) $(OBJ) -o $(TAR)
# main.o : main.s
# gcc -c main.s -o main.o
#
# main.s : main.i
# gcc -S main.i -o main.s
#
# main.i : main.c
# gcc -E main.c -o main.i
#
# add : add.o add.o
# gcc add.o -o add
#
# add.o : add.s
# gcc -c add.s -o add.o
#
# add.s : add.i
# gcc -S add.i -o add.s
#
# add.i : add.c
# gcc -E add.c -o add.i
#
.PHONY:
clear :
rm -rf add.i add.s add.o add.i add.s add.o
隐含规则:
1. %.c : 任意的c文件
2. *.c : 所有的c文件
# this is a simple code about processing 1 + 2 and printing result .
# In order to compare with makefile above, only minor changes have been made here
G := gcc
TAR = main
$(TAR) : *.c
$(G) *.c -o $(TAR)
# main.o : main.s
# gcc -c main.s -o main.o
#
# main.s : main.i
# gcc -S main.i -o main.s
#
# main.i : main.c
# gcc -E main.c -o main.i
#
# add : add.o add.o
# gcc add.o -o add
#
# add.o : add.s
# gcc -c add.s -o add.o
#
# add.s : add.i
# gcc -S add.i -o add.s
#
# add.i : add.c
# gcc -E add.c -o add.i
#
.PHONY:
clear :
rm -rf main.i main.s main.o add.i add.s add.o main
通配符:
1. $^ :所有的依赖文件
2. $@: 所有的目标文件
# this is a simple code about processing 1 + 2 and printing result .
# In order to compare with makefile above, only minor changes have been made here
G := gcc
TAR = main
$(TAR): *.c
$(G) $^ -o $@
# main.o : main.s
# gcc -c main.s -o main.o
#
# main.s : main.i
# gcc -S main.i -o main.s
#
# main.i : main.c
# gcc -E main.c -o main.i
#
# add : add.o add.o
# gcc add.o -o add
#
# add.o : add.s
# gcc -c add.s -o add.o
#
# add.s : add.i
# gcc -S add.i -o add.s
#
# add.i : add.c
# gcc -E add.c -o add.i
#
.PHONY:
clear :
rm -rf main.i main.s main.o add.i add.s add.o main
Makefile 的使用
$ make
# 进行编译
$ make clear
# 执行删除命令