zoukankan      html  css  js  c++  java
  • Linux——如何编写Makefile文件

    一个简单的例子:起初有两个.c和两个.h文件(hannuo.c不是不用管)
    test.c:

     test.h:

    txt.c:

    txt.h:

    文件都在同一目录下:

    一般情况下编译:

     可以看到成功生成了result文件,执行:

     现在通过编写Makefile文件来实现:

    首先建立一个Makefile文件(之前我建好了如上,没有需要建一个,名字必须为Makefile或makefile),然后用vim对文件进行编写。

    先写依赖关系,再写编译等命令(命令必须以tab键开头,这里将目标文件名定为result,可以自己拟定)
    ---------------------------------------------------
    result:test.o txt.o          //依赖关系
      gcc -o result test.o txt.o    //命令
    test.o:test.c
      gcc -c test.c
    txt.o:txt.c test.h txt.h
      gcc -c txt.c test.h txt.h
    ---------------------------------------------------
    这样Makefile文件就制作好了,接下来返回到终端,输入make命令就可生成result文件,运行一下。(下面先把原本生成的result删掉,代码复制粘贴后命令前的不是tab键,要改一下)
    Makefile:

    结果:

    上面写法是最原始的一种,可以用字符串代替方法简化编写。

    运行结果:

     解释:"="前面的等价后面的,用$()来引用格式不变,clean:命令用来清除编译所生成的文件,$(obj)即生成的.o文件,result即生成的可执行文件,清除后如下。

    还有写法:

     运行结果:

     其中.gch为预编译头文件,加快编译速度

    下面还有更简洁的写法:

    运行结果:

     

     在这里,我们用到了几个特殊的宏。%.o:%.c,这是一个模式规则,表示所有的.o目标都依赖于与它同名的.c文件(还有head中列出的头文件),$^表示所有依赖的关系的,这里即.c和.h文件,$<表示依赖关系第一项,即.c文件,不过这里没用到,只是介绍一下。如果.o或者其它文件过多则会看起来一大串还是不够简洁,可以添加函数来写使之更方便,如下:

     其中,shell函数主要用于执行shell命令(终端命令)./即当前目录下,路径可以更改为你程序文件所在目录以便可以找到,具体到这里就是找出当前目录下所有的.c和.h文件。而$(source:%.c=%.o)则是一个字符替换函数,它会将source所有的.c字串替换成.o,即所有的.o文件,这样无论我们在该工程加入多少.c和.h文件Makefile都能自动将其纳入到工程中来,无需手动添加极其方便,同时无论生成多少其它文件,都可用make clean命令一次清除,还原到最初状态。(上述仅供参考

     

      

     

  • 相关阅读:
    Thinking in Java Reading Note(9.接口)
    Thinking in java Reading Note(8.多态)
    Thinking in Java Reading Note(7.复用类)
    SQL必知必会
    Thinking in Java Reading Note(5.初始化与清理)
    Thinking in Java Reading Note(2.一切都是对象)
    鸟哥的Linux私房菜笔记(1.基础)
    Thinking in Java Reading Note(1.对象导论)
    CoreJava2 Reading Note(2:I/O)
    CoreJava2 Reading Note(1:Stream)
  • 原文地址:https://www.cnblogs.com/zwsmile/p/12603737.html
Copyright © 2011-2022 走看看