• Linux项目自动化构建工具-make/Makefile


    1.make/Makefile

    Makefile也是一个普通文件,文件中包括依赖关系依赖方法

    依赖关系就像我们很小的时候依赖自己的父母长大是一样的,转换到文件中就是说一个可执行程序是依赖源文件的;而过程就是依赖方法,源文件通过编译形成可执行程序。

    下面来看一个简单的Makefile文件:

    1. [zwx@VM-20-3-centos mytest]$ cat Makefile
    2. mytest:test.c
    3. gcc test.c -o mytest

    mytest: test.c是依赖关系,依赖方法就是test.c编译形成可执行程序的指令。

    1.1 make指令执行

    准备好Makefile,下面在test.c中写下一段简单的代码:

    1. #include
    2. int main()
    3. {
    4. printf("Hello Makefile\n");
    5. return 0;
    6. }

     使用make指令:

    1. [zwx@VM-20-3-centos mytest]$ make
    2. gcc test.c -o mytest

    使用make指令之后默认执行了mytest: test.c的依赖方法,那如果Makefile文件中,有其他的依赖关系和依赖方法,make指令默认执行的是什么呢?

    1.2 .PHONY

    一般来说,依赖关系中的前者是目标文件;但是如果加上了 . PHONY,前者就是一个伪目标,而伪目标总是被执行的

    介绍.PHONY之前先来介绍一下stat指令:查看文件的Acess(最近访问时间)、Modify(最近修改时间-文件内容)、Change(最近修改时间-文件属性)。

    1. [zwx@VM-20-3-centos mytest]$ stat test.c
    2. File: ‘test.c’
    3. Size: 81 Blocks: 8 IO Block: 4096 regular file
    4. Device: fd01h/64769d Inode: 1444487 Links: 1
    5. Access: (0764/-rwxrw-r--) Uid: ( 1002/ zwx) Gid: ( 1002/ zwx)
    6. Access: 2022-11-11 18:55:28.149902027 +0800
    7. Modify: 2022-11-11 18:55:26.179928784 +0800
    8. Change: 2022-11-11 18:55:50.895593084 +0800

    这里就有很多人会问了,这三个时间在这里有什么用呢?

    当使用make指令编译源文件的时候,如果文件已经编译,并且源文件没有修改,那么无法执行编译的指令;

    关于源文件和可执行程序的顺序,一定是首先出现源文件,然后通过源文件编译链接形成可执行程序,所以如果test.c的Modify时间比mytest要晚的话,说明test.c不是最新的,可以编译链接;否则就无法继续再编译链接。

    怎么理解伪目标总是被执行的?

    clean被.PHONY修饰之后,总是根据依赖关系,执行依赖方法。

    1.3 多文件中Makefile的使用

    Makefile在多文件中使用起来就更简单了,像我们前面写的依赖方法只是一条指令,如果有很多指令的话,使用起来更简单。

    只要同时编译main.c和test.c就能生成可执行程序:

    1. [zwx@VM-20-3-centos mytest]$ gcc test.c main.c -o mytest
    2. [zwx@VM-20-3-centos mytest]$ ll
    3. total 28
    4. -rw-rw-r-- 1 zwx zwx 45 Nov 11 19:14 main.c
    5. -rw-rw-r-- 1 zwx zwx 71 Nov 11 18:58 Makefile
    6. -rwxrwxr-x 1 zwx zwx 8416 Nov 11 19:14 mytest
    7. -rw-rw-r-- 1 zwx zwx 63 Nov 11 19:11 test.c
    8. -rw-rw-r-- 1 zwx zwx 46 Nov 11 19:14 test.h
    9. [zwx@VM-20-3-centos mytest]$ ./mytest
    10. hello show

    那如果我们想要使用Makefile来完成呢,应该怎样去写:

    1. [zwx@VM-20-3-centos mytest]$ cat Makefile
    2. mytest:test.o main.o
    3. gcc test.o main.o -o mytest
    4. test.o:test.c
    5. gcc -c test.c -o test.o
    6. main.o:main.c
    7. gcc -c main.c -o main.o
    8. .PHONY:clean
    9. clean:
    10. rm -f *.o mytest

    1. [zwx@VM-20-3-centos mytest]$ make
    2. gcc -c test.c -o test.o
    3. gcc -c main.c -o main.o
    4. gcc test.o main.o -o mytest
    5. [zwx@VM-20-3-centos mytest]$ ll
    6. total 36
    7. -rw-rw-r-- 1 zwx zwx 45 Nov 11 19:14 main.c
    8. -rw-rw-r-- 1 zwx zwx 1360 Nov 11 19:20 main.o
    9. -rw-rw-r-- 1 zwx zwx 166 Nov 11 19:20 Makefile
    10. -rwxrwxr-x 1 zwx zwx 8416 Nov 11 19:20 mytest
    11. -rw-rw-r-- 1 zwx zwx 63 Nov 11 19:11 test.c
    12. -rw-rw-r-- 1 zwx zwx 46 Nov 11 19:14 test.h
    13. -rw-rw-r-- 1 zwx zwx 1496 Nov 11 19:20 test.o
    14. [zwx@VM-20-3-centos mytest]$ ./mytest
    15. hello show

     多文件中使用Makefile还是非常方便的,一次写好之后,可以连续使用。

  • 相关阅读:
    性格孤僻的原因和改善方法
    刷题篇(一)
    信号量 线程通信- Linux系统编程-(pthread)
    网络安全(黑客技术)自学
    20230527 K-均值聚类算法,由INSCODE AI创作助手进行生成
    竞赛选题 深度学习的水果识别 opencv python
    在一台笔记本电脑上试用Ubuntu22.04
    象棋中的马跳步问题
    【云原生】Kubernetes----Metrics-Server组件与HPA资源
    Markdown
  • 原文地址:https://blog.csdn.net/qq_63179783/article/details/127811101