关于gcc和Makefile的使用总结

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 
# 执行删除命令

猜你喜欢

转载自blog.csdn.net/qq_45279570/article/details/107311665