zoukankan      html  css  js  c++  java
  • 实例讲解Linux下的makefile

    1、程序代码结构如下

    makefile/
    |-- Makefile
    |-- haha.c
    `-- hehe.c

      1.1、需要被编译的源代码如下

    $ cat haha.c 
    #include "stdio.h"
    
    int main()
    {
        printf("ha ! ha !
    ");
    
        return 0;
    }
    $ cat hehe.c 
    #include "stdio.h"
    
    int main()
    {
        printf("he ~ he ~
    ");
    
        return 0;
    }

      1.2、makefile的脚本如下

    $ cat Makefile 
    .PHONY : dummy
    
    CFLAGS    = 
    LDFLAGS    = 
    
    ALL_FILES    = hehe haha
    
    all : $(ALL_FILES)
    
    hehe : hehe.o
        gcc -o hehe hehe.o
    
    hehe.o : hehe.c
        gcc -c hehe.c -o $@
    
    haha : haha.o
        gcc -o haha haha.o
    
    haha.o : haha.c
        gcc -c haha.c -o haha.o
    
    clean : dummy
        rm -rf *.o
        rm -rf $(ALL_FILES)

      1.3、执行make命令后的编译结果

    $ make
    gcc -c hehe.c -o hehe.o
    gcc -o hehe hehe.o
    gcc -c haha.c -o haha.o
    gcc -o haha haha.o
    -rwxrwxr-x 1 normal normal 4940 12-11 16:08 haha
    -rw-rw-r-- 1 normal normal   72 12-11 16:03 haha.c
    -rw-rw-r-- 1 normal normal  872 12-11 16:08 haha.o
    -rwxrwxr-x 1 normal normal 4940 12-11 16:08 hehe
    -rw-rw-r-- 1 normal normal   72 12-11 16:03 hehe.c
    -rw-rw-r-- 1 normal normal  872 12-11 16:08 hehe.o
    -rw-rw-r-- 1 normal normal  279 12-11 16:04 Makefil

    这样我们需要的程序就编译出来了。文件结构如下

    makefile/
    |-- Makefile
    |-- haha
    |-- haha.c
    |-- haha.o
    |-- hehe
    |-- hehe.c
    `-- hehe.o

    多出来了4个文件,haha、haha.o、hehe、hehe.o

      1.4、执行结果

    $ ./haha 
    ha ! ha !
    $ ./hehe 
    he ~ he ~

      1.5 执行命令make clean,结果如下

    $ make clean
    rm -rf *.o
    rm -rf hehe haha

    多出来的文件都被删除了,接下来对makefile的脚本文件进行一下讲解。

    2、下面是对makefile文件的讲解

      2.1、在make命令执行后,会在当前目录下搜索makefile、Makefile。如果当前目录没有这个两个文件的话就会报错:找不到makefile

    $ make
    make: *** 没有指明目标并且找不到 makefile。 停止。

      2.2、现在把Makefile改名,用参数-f 来指定要加载的脚本文件也是可以顺利编译的。

    $ mv Makefile realmake
    $ make -f realmake 
    gcc -c hehe.c -o hehe.o
    gcc -o hehe hehe.o
    gcc -c haha.c -o haha.o
    gcc -o haha haha.o

      2.3、在Makefile脚本中,make会默认寻找第一个目标进行编译。比如上面的Makefile中,make会从上到下进行扫描,当扫描到“all :”的时候,终于找到一个目标了,然后就会对这个目标进行操作。当make发现这个all需要$(ALL_FILES)的时候,时候就会去寻找$(ALL_FILES)。但是,make在加载脚本的时候会把ALL_FILES变量进行置换为hehe haha,所以换成了寻找hehe和haha进行编译。当执行hehe的时候又发现需要hehe.o,然后又去寻找hehe.o,如此循环寻找吧,直到hehe.c的时候,终于在当前目录找到hehe.c了,这个调用栈才算到头了。

  • 相关阅读:
    提升PHP执行效率的一些小细节
    linux文件处理命令
    C# file操作
    C# MD5
    C# guid
    C# Path类 Directory类
    MarkDown学习
    从GitHub建站迁移到服务器(Java环境)
    sonarqube在windows上软件安装,配置及使用
    【优化】记录一次方法性能优化
  • 原文地址:https://www.cnblogs.com/fengbohello/p/4157864.html
Copyright © 2011-2022 走看看