[Linux]项目自动化构建工具 Makefile/make的使用(新手向)

背景

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

我们可以在makefile文件当中提前将编译代码写入,在需要使用使用make命令直接执行

理解

makefile写入的格式是:

target : dependencies  #这里顶格写

        command             #这里前面必须有一个tab

  • target是目标文件,是生成文件的名字
  • dependencies是依赖文件

        想了解依赖文件,我们需要先了解文件之间的依赖关系

        在编译程序时,头文件是必不可少的,我们可以称main.c代码文件依赖于main.h头文件

        在了解编译器编译程序的过程之后,可以知道main.c文件在形成可执行文件时会进行

        main.c->main.i->main.s->main.o 最后可能有多个.o文件链接为一个可执行文件(分离编译)

        由此可以看出,各个文件是存在依赖关系的

main 依赖 main.o,

main.o 依赖 mian.s,

main.s 依赖 mian .i,

main.i 依赖 main.c.

        dependencies就是target文件在生成时必要的依赖文件

        在编写makefile文件时需要将这些依赖关系写出

  • command是生成target文件所需要的代码

        在linux命令行编译c代码可以是一步到位

gcc main.c -o main

        也可以是

gcc -E main.c -o main.i

gcc -S main.i -o main.s

gcc -c main.s -o main.o

gcc main.o -o main

所以此时我们就可以写出一个简单的makefile文件了

//makefile
//依赖关系由可执行文件main逐级向源文件main.c靠近
main:main.o
    gcc main.o -o main
main.o:main.s
    gcc -c main.s -o main.o
main.s:main.i
    gcc -S main.i -o main.s
main.i:main.c
    gcc -E main.c -o main.i

在与代码同一目录下创建好了makefile之后,就可以直接使用make命令编译代码

[Linux]项目自动化构建工具 Makefile/make的使用(新手向)_第1张图片

 [Linux]项目自动化构建工具 Makefile/make的使用(新手向)_第2张图片

main文件就可以直接执行了 

 同时也可以在makefile中写入clean

 [Linux]项目自动化构建工具 Makefile/make的使用(新手向)_第3张图片

这样就可以在命令行输入make clean 直接删除这些文件

 [Linux]项目自动化构建工具 Makefile/make的使用(新手向)_第4张图片

 当然这样的makefile在正常的程序当中是不会出现的,太复杂了,我们没必要将全部中间文件都一一列举出来,我们可以直接到main.o 文件,这样既可以保留分离编译的特性,又省去了冗余的文件。同时记得clean部分代码也需要修改。

[Linux]项目自动化构建工具 Makefile/make的使用(新手向)_第5张图片

[Linux]项目自动化构建工具 Makefile/make的使用(新手向)_第6张图片

【注】:在看别人写的Makefile文件时,你可能会碰到以下三个变量:$@,$^,$<

                   $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。

进阶

自动推导

在写好target文件名后,makefile可以自动推导添加其同名的[.c]文件,以及简单的执行代码

或者make看到一个[.o]文件,它也会自动的把[.c]文件加在依赖关系中,并且 cc -c main.c 也会被推导出来。

#只要写一个目标文件就可以完成后续推导
main:
#等价于
main:main.c
    cc -o main main.c

#或者是分离编译时
a.out:main1.o main2.o
    cc -o a.out main1.o main2.o
main1.o:
main2.o:
#等价于
a.out:main1.o main2.o
    cc -o a.out main1.o main2.o
main1.o:main.c
    cc -c -o main1.o main1.c
main2.o:main2.c
    cc -c -o main1.o main1.c

[Linux]项目自动化构建工具 Makefile/make的使用(新手向)_第7张图片

[Linux]项目自动化构建工具 Makefile/make的使用(新手向)_第8张图片

加入还需要其他依赖文件就不要用这种方法了

你可能感兴趣的:(linux,自动化,运维)