Makefile

发布时间 2024-01-11 15:05:00作者: —_—Zed

基本的语法规则是:

    target ... : prerequisites ...
            command
            ...
            ...

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。

 prerequisites就是,要生成那个target所需要的文件。

 command也就是make需要执行的命令。(任意的Shell命令)

prerequisites中如果有一个以上的文件比target文件要新(修改日期)的话,command所定义的命令就会被执行。

 

 

    edit : main.o kbd.o command.o display.o /
           insert.o search.o files.o utils.o
            cc -o edit main.o kbd.o command.o display.o /
                       insert.o search.o files.o utils.o
    main.o : main.c defs.h
            cc -c main.c
    kbd.o : kbd.c defs.h command.h
            cc -c kbd.c
    command.o : command.c defs.h command.h
            cc -c command.c
    display.o : display.c defs.h buffer.h
            cc -c display.c
    insert.o : insert.c defs.h buffer.h
            cc -c insert.c
    search.o : search.c defs.h buffer.h
            cc -c search.c
    files.o : files.c defs.h buffer.h command.h
            cc -c files.c
    utils.o : utils.c defs.h
            cc -c utils.c
    clean :
            rm edit main.o kbd.o command.o display.o /
               insert.o search.o files.o utils.o

 make执行的过程类似于递归搜索,edit依赖于main.o,当它找不到main.o,则会去找main.o所需要的依赖。

反斜杠(/)是换行符的意思。

cc 是unix编译器,与gcc不同的是,它只能编译c语言,不能编译c++。

执行cc -c xx.c 生成的二进制文件名就是xx.o。

target就是:前的,prerequisites就是:后的。

命令以table开头,make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。

由于clean没有prerequisite,它只是一个动作,需要手动去make clean 执行。

 

 

 objects = main.o kbd.o command.o display.o \
              insert.o search.o files.o utils.o
 source_files = -c \ 
         main.c kbd.c commond.c \
        display.c files.c utils.c insert.c

 head_dirs = -I ./
 all:$(objects)
 
 %.o:%.c
    gcc $(head_dirs) $(source_files)
     gcc $(objects) $(head_dirs) -o test
.PHONY : clean clean : rm edit $(objects)

定义变量并引用:

  .PHONY : clean 表示clean是个伪目标。
  make先执行 all:$(objects)

  %是一个通配符。

  然后执行 %.o:%.c

  然后执行两个编译命令。

 

 

编译选项:

-Wall:选项可以打印出编译时所有的错误或者警告信息。

-O0: 表示编译时没有优化。

-O1: 表示编译时使用默认优化。

-O2: 表示编译时使用二级优化。

-O3: 表示编译时使用最高级优化。

-Os:相当于-O2.5优化,但又不所见代码尺寸。