zoukankan      html  css  js  c++  java
  • Makefile 入门与基本语法 分类: C/C++ ubuntu 2015-05-18 11:16 466人阅读 评论(0) 收藏

    在我看来,学会写简单的Makefile,阅读较复杂的makefile,是每一个Linux程序员都必须拥有的基本素质。Makefile可以自动识别哪些源文件被更改过,需要重新编译,那些不需要。从而节省大型工程重新编译的时间。规则如下:

    1. 如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
    2. 如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程。
    3. 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

    学会编写Makefile,不仅仅有益于你在Linux下编写大型工程。同时也能帮助你理解编译原理。远离IDE,了解编译过程。

    废话少说,Makefile其实最主要的语法只有一句:

    target ... : prerequisites ...
    command......

    target就是目标文件,prerequisites表示所有生成目标文件所需的拥有依赖关系的文件。command就是由依赖文件生成目标文件的编译命令。
    所以,对于单个的.c文件,一个最最简单的Makefile如下:

    object: main.c
        gcc -o object main.c

    当然,对于单个C文件使用Makefile几乎没有意义。
    下面来看一个稍复杂一点儿的Makefile文件:

    DIR=./
    object: main.o 1.o 2.o 
        gcc -o object main.o 1.o 2.o
    1.o: 1.c my.h
        gcc -c 1.c
    2.o: 2.c my.h
        gcc -c 2.c
    main.o: main.c my.h
        gcc -c main.c
    
    .PHONY: clean
    
    clean: 
        rm $(DIR).o object

    这是一个稍有实用价值的Makefile,工程由四个源文件构成:my.h 1.c 2.c main.c。
    放在最前面的

    DIR=./

    是变量定义。Makefile中的的变量定义多为字符串,主要目的是为了避免重复长字符串输入。
    1.o 2.o main.o 分别是三个源文件生成的链接文件。如果你不知道链接文件是什么。。。。找度娘吧。。
    首先第一个target一般为最终目标文件,之后的target一般为过程文件。
    .PHONY是用来定义伪目标用的。伪目标不是实际要生成的文件,一般为make命令带入的参数。例如上面文件中的clean,其对应的命令为清除所有中间文件以及最后的目标文件。
    其实,一般不定义伪目标也是OK的,但是一旦目录下出现了和伪目标重名的文件。这时候Makefile执行伪目标命令就会出错。因为Makefile不知道这是伪目标,而伪目标又没有依赖文件,所以Makefile会跳过伪目标文件对应的命令。

    以上,是对Makefile的一个简单入门介绍,一般,用以阅读大多数的Makefile都已经足够了。深究请百度或者Google。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Java实现 LeetCode 56 合并区间
    JQuery实现对html结点的操作(创建,添加,删除)
    JQuery实现对html结点的操作(创建,添加,删除)
    JQuery实现对html结点的操作(创建,添加,删除)
    Java实现 LeetCode 55 跳跃游戏
    Java实现 LeetCode 55 跳跃游戏
    Java实现 LeetCode 55 跳跃游戏
    Java实现 LeetCode 54 螺旋矩阵
    Java实现 LeetCode 54 螺旋矩阵
    Java实现 LeetCode 54 螺旋矩阵
  • 原文地址:https://www.cnblogs.com/paulweihan/p/4660096.html
Copyright © 2011-2022 走看看