gcc编译过程+Makefile反思

看了一段时间的《程序员自我修养》了,也算对程序的编译,链接,装载的原理有了初步的了解。十分惭愧的是,今天想自己写一个简单的Makefile,竟然很模糊,无法十分自如的写出(平时都用一个已经写好的样板改),这里做一个反思。

 

假设有a.c文件,要把它编译成可执行文件a。

 

编译+汇编:

试了一下,以下三种写法都行:

gcc -c a.c -o a.o

gcc -c -o a.o a.c

gcc -c a.c

以上三种写法都会生成目标文件a.o。

为了让gcc在编译时产生调试信息,通常我们加上-g -O -Wall的编译选项

 

 

链接:

试了一下,以下两种写法都行:

gcc -o a a.o

gcc a.o -o a

以上两种写法都会产生可执行文件a

 

也可以直接用gcc -o a a.c一步完成编译和链接过程。

 

总结:在以上编译命令中,-o后面一定要接产生的目标。其他的顺序就可以随意。

 

再顺便复习一下简单Makefile的写法。

1、Makefile中变量的使用,如需定义TARGET变量

TARGET = a

当需要引用TARGET变量时,使用$(TARGET)

 

2、自动变量的使用,主要是以下三个:

$@: 表示规则中的目标文件集。

$<: 依赖目标中的第一个目标名字。

$^: 所有依赖目标的集合。

 

3、模式规则%的使用

%.c表示所有以.c结尾的文件,%.o表示所有以.o结尾的文件。

 

4、wildcard关键字和patsubst关键字的使用

如果要取一个特定的集合,可以用wildcard,如

SOURCE_FILES = $(wildcard *.c)表示让SOURCE_FILES的值是所有.c文件的集合

如果要替换一个集合中某些部分为其他的东西,则可用patsubst,它是一个模式字符串替换函数

如,OBJS = $(patsubst %.c,%.o,$(SOURCE_FILES))表示把SOURCE_FILES中的所有.c文件都替换成.o文件。

 

5、伪目标的使用

最典型的就是make clean的使用,写法如下:

.PHONY:clean:

clean:

rm -rf a a.o

 

以下是一个简单的常用Makefile模板:

CC = gcc CFLAGS = -Wall -O -g SOURCE_FILES = $(wildcard *.c) OBJS = $(patsubst %.c,%.o,$(SOURCE_FILES)) TARGET = a %.o : %.c %.h $(CC) -c $(CFLAGS) $< -o $@ %.o : %.c $(CC) -c $(CFLAGS) $< -o $@ $(TARGET) : $(OBJS) $(CC) $^ -o $@ .PHONY:clean clean: rm -rf $(TARGET) $(OBJS) 

你可能感兴趣的:(linux编程,C/C++)