zoukankan      html  css  js  c++  java
  • Linux开发工具之Makefile(上)

    二、makefile(上)
    01.make工具
      利用make工具可以自动完成编译工作。这些工作包括:如果修改了某几
    个源文件,则只重装新编译这几个源文件;如果某个头文件被修改了,则
    重新编译所有包含该头文件的源文件。利用这个自动编译可大大简化开发
    工作,避免不必要的重新编译。
      make工具通过一个称为Makefile的文件来完成并自动维护编译工作。
    Makefile文件描述了整个工程的编译、链接等规则。
    02.Makefile的基本规则:
      TARGET...:DEPENDENCIES...
    COMMAND
    ...
      目标(TARGET)程序产生的文件,如何执行文件和目标文件;目标也可
    以是要执行的动作,如clean,也成为伪目标。
      依赖(DEPENDENCIES)是用来产生目标的输入文件列表,一个目标通常依
    赖于多个文件。
      命令(command)是make执行的动作(命令是shell命令或是可在shell
    下执行的程序)。注意:每个命令行的起始字符必须为TAB字符!
      如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,
    这就是Makefile最核心的内容
    #touch main.c add.c sub.c add.h sub.h
    #ls
    main.c add.c sub.c add.h sub.h
    #vi main.c
    int main()
    {
    return 0;
    }
    #vi Makefile
    main:main.o add.o sub.o
    gcc -Wall -g main.o add.o sub.o -o main
    main.o:main.c
    gcc -Wall -g -c main.c -o main.o
    add.o:add.c add.h
    gcc -Wall -g -c add.c -o add.o
    sub.o:sub.c sub.h
    gcc -Wall -g -c sub.c -o sub.o
    #make(默认生成第一个目标)
    #ls
    main
    #make(文件没有变化)
    make:'main' id up to date
    #touch sub.h(重新生成sub.h)
    #make
    gcc -Wall -g -c sub.c -o sub.o
    gcc -Wall -g main.o add.o sub.o -o main
    clean:(伪目标,并不是要生成的文件,用来删除这些文件)
    rm -f main main.o add.o sub.o
    #make clean
    将链接文件全部删除
    #make main.o
    只生成main.o这个文件
    .PHONY:clean(Makefile文件的最开头.表示clean是一个伪目标)
    如果Makefile所在的文件夹下,存在clean文件,则执行make clean时会
    提示:make:'clean'is up to date.
    03.Makefile自动化变量
    $@:规则的目标文件名
    $<:规则的第一个依赖文件名
    $^:规则的所有依赖文件列表
    #vi Makefile.1
    .PHONY:clean
    OBJECTS=main.o add.o sub.o
    main:$(OBJECTS)
    gcc -Wall -g $^ -o $@
    main.o:main.c
    gcc -Wall -g -c $< -o $@
    add.o:add.c add.h
    gcc -Wall -g -c $< -o $@
    sub.o:sub.c sub.h
    gcc -Wall -g -c $< -o $@
    clean:
    @(加@不会打印在屏幕上)echo "begin delete..."(命令还是要
    执行)
    rm -f main $(OBJECTS)
    #make
    (正常工作)
    #make clean
    (正常工作)
    #make clean -f Makefile.1
    (以Makefile.1的规则来执行clean这个命令)
    begin delete...
    rm -f main main.o add.o sub.o
    04.Makefile编译多个可执行文件
      模式规则:%.o:%.c
      后缀规则:.c.o
    #mkdir 01
    #mv *.c 01
    #ls
    #mv *.* 01
    #ls
    01 Makefile
    #mv Makefile 01
    #ls
    #mkdir 02
    #cd 02
    #touch 01test.c 02test.c(01test.c,02test.c都要生成可执行文件)
    #vi 01test.c 
    int main(void)
    {
    return 0;
    }
    #vi02test.c
    int main(void)
    {
    return 0;
    }
    #vi Makefile
    .PHONY:clean
    BIN=01test 02test
    all:$(bin)
    01test:01test.o
    gcc -Wall -g  $^ -o $@
    02test:02test.o
    gcc -Wall -g  $^ -o $@
    clean:
    rm -f *.o $(BIN)
    #make
    01test 02test
    #vi Makefile
    BIN依赖两个文件
    all这个目标依赖BIN两个文件
    编译器自动将同名的"*.c"文件生成同名可执行文件
    #make
    cc 01test.c -o 01test
    cc 02test.c -o 02test
    #make clean
    #ls
    01test.c 02test.c Makefile
    #make
    cc -c -o 01test.o 01test.c
    gcc -Wall -g -c 01test.o -o 01test
    #make clean
    #ls
    01test.c 02test.c Makefile
    #vi Makefile
    %.o:%.c(将对应的.c文件生成.o文件)
    gcc -Wall -g -c $< -o $@
    #make clean
    #make
    #ls
    #vi Makefile
    CC=gcc
    CFLAGS=-Wall -g
    #%.o:%.c
    # $(CC) $(CFLAGS) -c $< -o $@
    .c.o:
    $(CC) $(CFLAGS) -c $< -o $@
    01test:01test.o
    $(CC) $(CFLAGS) $^ -o $@
    02test:02test.o(将光标定位到这里,输入2yy,复制两行)
    $(CC) $(CFLAGS) $^ -o $@
    (点击p,复制到这里)
    #make clean
    #make
    #ls
    #vi 03test.c
    int mian(void)
    {
    return 0;
    }
  • 相关阅读:
    马尔科夫过程的CKS方程的推导
    科研的一些工具和想法
    读研究生后的一些想法
    读过的一些好书以后可做参考
    latex学习笔记
    机器人工程师学习要求
    《MySQL实战45讲》(8-15)笔记
    《MySQL实战45讲》(1-7)笔记
    java11运行javaFX项目
    ClickHouse入门笔记
  • 原文地址:https://www.cnblogs.com/baiyifan/p/5278588.html
Copyright © 2011-2022 走看看