Linux C语言 Makefile 书写
今天在Linux系统下编写了一个C程序,由于头文件和C文件很多而且在不同的文件夹内,导致每次用gcc的时候很麻烦,需要写一大行并且还要注意顺序,使得每次写的时候很费劲,而Makefile书写好后在调试的时候就方便多了!
原gcc命令:
由于a文件夹中的.c文件依赖b文件夹中的.c文件,而demo.c依赖a和b文件夹中的c,而且需要链接多线程库 -ldl pthread 。
命令:gcc ../a/b/*.c ../a/*.c ./demo.c -o app -ldl pthread
对应的Makefile:
target = app target :生成可执行文件的名字
CC = gcc CC :将关键字gcc重命名
CFLAGS = -ldl -lpthread CFLAGS : 重命名链接多线程库
OBJ1 = $(patsubst %.c,%.o,$(shell ls ../a/b/*.c)) OBJ1 :b文件夹中的.c文件转化成.o文件
注:patsubst 替换通配符 后面是shell命令
OBJ2 = $(patsubst %.c,%.o,$(shell ls ../a/*.c)) OBJ2 :a文件夹中的.c文件转化成.o文件
OBJ3 = $(patsubst %.c,%.o,$(shell ls ./demo.c)) OBJ3 :demo.c文件转化成.o文件
OBJS = $(OBJ1) $(OBJ2) $(OBJ3) 将OBJ1 ,OBJ2 ,OBJ3 用空格连接到OBJS
$(target):$(OBJS)
$(CC) $(OBJS) -o $(target) $(CFLAGS) 将.o文件编译成可执行文件,并命名为target变量的名字 app
同时加上链接多线程库(代码中没有多线程 可以不加)
%.o:%.c
$(CC) -c $< -o $@ 将所有的.c编译成.o
clean:
rm -rf $(OBJS) clean:删除所有.o文件
all:
@echo $(OBJS) all:打印所有.o文件
例如:
target = app CC = gcc CFLAGS = -ldl -lpthread OBJ1 = $(patsubst %.c,%.o,$(shell ls ../a/b/*.c)) OBJ2 = $(patsubst %.c,%.o,$(shell ls ../a/*.c)) OBJ3 = $(patsubst %.c,%.o,$(shell ls ./demo.c)) OBJS = $(OBJ1) $(OBJ2) $(OBJ3) $(target):$(OBJS) $(CC) $(OBJS) -o $(target) $(CFLAGS) %.o:%.c $(CC) -c $< -o $@ clean: rm -rf $(OBJS) all: @echo $(OBJS)

浙公网安备 33010602011771号