zoukankan      html  css  js  c++  java
  • Makefile学习(一)[第二版]

    简单介绍

    1)make:利用 make 工具能够自己主动完毕编译工作。这些工作包含:假设仅改动了某几个源文件,则仅仅又一次编译这几个源文件[make通过比对对应的.c文件与.o文件的时间];假设某个头文件被改动了,则又一次编译全部包含该头文件的源文件。利用这样的自己主动编译可大大简化开发工作,避免不必要的又一次编译。

    2)Mackfile:make工具通过一个称为 Mackfile 的文件来完毕并自己主动维护编译工作。Mackfile文件描写叙述了整个project的编译、连接等规则

     

    Mackfile基本规则

    Target ...: Dependencies ...

    Command ...

     

    说明:

    1)目标(TARGET):即终于想要产生的文件。如:可运行文件,目标文件或中间文件等;目标也能够是要运行的动作,如clean,也称为伪目标。

    2)依赖(DEPENDENCIES):为了产生目标文件而依赖的文件列表,一个目标通常依赖于多个文件。

    3)命令(COMMAND):是make运行的动作(shell命令或是可在shell下运行的程序,如echo)。注意:每一个命令行的起始字符必须为TAB字符

    假设DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要运行,这就是Makefile最核心的内容.

     

    简单的Mackfile演示样例

     

    #1 最简单

    hello:

    gcc -o hello hello.c

     

    #2 略微复杂

    hello:hello.o

    gcc -o hello hello.o

     

    hello.o:

    gcc -o hello.o -c hello.c

     

    #3 进一步完好

    hello:hello.o

    gcc -o hello hello.o

     

    hello.o:

    gcc -o hello.o -c hello.c

     

    clean:

    rm -rf hello.o  #delete file hello.o

     

    #4 在Mackfile中运行shell命令[@符号:不输出命令本身]

    hello:hello.o

    gcc -o hello hello.o

    @echo "--------------ok------------"

     

    hello.o:

    gcc -o hello.o -c hello.c

     

    clean:

    rm -rf hello.o  #delete file hello.o

     

    #5 综合[.PHONY:#显示声明伪目标]

    .PHONY: clean

    main: main.o sub.o add.o

    gcc -Wall -g -o main main.o sub.o add.o

     

    main.o: main.c

    gcc -Wall -g -o main.o -c main.c

     

    add.o: add.c add.h

    gcc -Wall -g -o add.o -c add.c

     

    sub.o: sub.c sub.h

    gcc -Wall -g -o sub.o -c sub.c

     

    clean:

    rm -f main.o sub.o add.o

     

    运行:

    1)make #生成第一个目标

    2)make clean #“生成”clean伪目标

    3)make main.o #仅生成main.o目标

    4)make -f Mackfile #显示指定运行的文件名称

     

    Makefile变量

    为了简化和维护Mackfile,能够在Mackfile中使用变量,格式

    varname=some_text

    引用变量的值:$(varname)

    依照惯例,在Mackfile中,变量一般大写

     

     

    Makefile自己主动化变量

    选项名

    作用

    $@

    规则的目标文件名称

    $<

    规则的第一个依赖文件名称

    $^

    规则的全部依赖文列表

    $*

    不包含后缀名的当前依赖文件名称

    $?

    当前目标所依赖的文件列表中比当前目标文件还要新的文件

     

     

    #综合演示样例

    .PHONY: clean

    .SUFFIXES: .c .o

    .c.o:

        gcc -Wall -g -o $@ -c $^

     

    OBJECTS = main.o sub.o add.o

    SOURCES = $(OBJECTS:.o=.c)

     

    main: $(OBJECTS)

        gcc -Wall -g -o $@ $^

     

    clean:

        @echo "delete execute file and object file..."

        rm -f $(OBJECTS) main

     

    附-

    .SUFFIXES:.c .o #表示不论什么x.c文件与x.o文件关联

     

    Make使用隐含推导规则/生成多个可运行文件

    #演示样例-生成多个可运行文件1

    .PHONY: clean all 

     

    BIN = 01test 02test

     

    all: $(BIN)

     

    clean:

        -rm -f $(BIN)

     

    #演示样例-生成多个可运行文件2-使用自己定制的规则,生成.o中间文件

    .PHONY: clean all 

     

    BIN = 01test 02test

    OBJECTS = $(BIN:=.o)

     

    all: $(BIN)

     

    01test.o: 01test.c

    02test.o: 02test.c

     

    clean:

    -rm -f $(BIN) $(OBJECTS)

     

    #演示样例-生成多个可运行文件3-使用更加仔细的规则

    .PHONY: clean all 

        

    CFLAGS = -g -Wall

    CC = gcc 

     

    BIN = 01test 02test

    OBJECTS = $(BIN:=.o)

     

    .SUFFIXES: .c .o

    .c.o:

        $(CC) $(CFLAGS) -c $< -o $@

     

    all: $(BIN)

     

    01test.o: 01test.c

    02test.o: 02test.c

     

    clean:

        -rm -f $(BIN) $(OBJECTS)

     

    模式规则与后缀规则

    %.o:%.c

    .c.o:

     

    #演示样例

    .PHONY: clean all 

     

    CC = gcc 

    CFLAGS = -Wall -g

    BIN = 01test 02test 

    SOURCES = $(BIN:=.c)

    OBJECTS = $(BIN:=.o)

     

    all: $(BIN)

     

    01test: 01test.o

    02test: 02test.o

     

    #%.o: %.c #模式规则

    #   $(CC) $(CFLAGS) -c $< -o $@

    .c.o: #后缀规则,与前作用同样

        $(CC) $(CFLAGS) -c $< -o $@

     

    clean:

        -rm -rf $(BIN) $(OBJECTS) 


  • 相关阅读:
    java中split函数参数特殊字符的处理(转义),如:"." 、"\"、"|"
    Javascript编程风格
    HTTP 错误 500.0的解决方法。
    在WCF中进行大数据量传输
    “您已使用临时配置文件登陆”的解决方法
    关于命令行执行Migrations
    转一篇关于部署的文章
    MSDeploy使用备忘
    不可征服
    git初始化项目
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5129270.html
Copyright © 2011-2022 走看看