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)

 

posted @ 2020-10-12 15:44  IT小平  阅读(207)  评论(0)    收藏  举报