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模板:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值