zoukankan      html  css  js  c++  java
  • Makefile学习笔记 我的CPP之路 C++博客

    Makefile学习笔记 - 我的CPP之路 - C++博客

    Makefile学习笔记

    Makefile学习笔记

    先列出一个很简单的Makefile例子:

    ---------
    hd.cpp

    #include "hd.h"

    using namespace std;

    int main() {
        cout << "hello, didier!1\n";
    }

    ---------
    hd.h

    #include <iostream>

    ---------
    Makefile    //我们称这个为Makefile1

    hd : hd.cpp    //注意,我没写hd.h
        g++ -o hd hd.cpp

    ---------
    make命令编译,当然没问题。但是注意,第一行我没有用如下写法:

    hd : hd.cpp hd.h
    所以Makefile1中,hd(可执行程序)不依赖于hd.h,只依赖于hd.cpp。编译通过是因为在Makefile1中第二行调用g++时,编译hd.cpp时会include "hd.h"。

    这样乍看没问题,实际上有很大的问题,Makefile1中hd不依赖于hd.h,意思是说,如果这时候我修改hd.h,再make,make程序依然只检测hd.cpp的版本,发现没变化,所以不会调用第二行的g++命令。测试,果然如此。无论怎么修改hd.h,再次调用make是没有动作的。

    不要以为在.cpp中会include头文件就可以不在Makefile中写依赖.h文件。这样得到的结论,或者说启发,就是,在一个工程中会有很多的文件依赖关系,会有很多程序员参与编码,如果修改了所依赖的文件,我们当然希望重新编译,所以,不要偷懒,在Makefile中一定要写全依赖关系。

    比如这个例子,正确的写法:

    ---------
    Makefile    //我们称这个为Makefile2

    hd : hd.cpp hd.h
        g++ -o hd hd.cpp
    ---------

    要搞清楚的是,Makefile2中,第一行所陈列的关系,就是希望make每次运行所要检测的文件版本变化,第二行,是希望所要执行的命令。Makefile2的依赖关系很全,每次修改hd.h,make都会重新执行。

    当然,如果不用make,直接在命令行中输入调用g++,那么.h的修改当然会被重新编译了。

    最后总结,在Makefile的编写中,每一个编译文件一定要写全其依赖关系,即使在cpp中会包含头文件。
  • 相关阅读:
    Log4J日志整合及配置详解
    SmartGit/Hg 4.0.1 发布
    Test Kitchen 0.7.0支持在OpenStack上对Opscode Chef进行集成测试
    RubyGNOME2 1.2.0 发布,支持 GTK+ 3
    PowerDNS Recursor 3.5 RC1 发布
    用于展现图表的50种JavaScript库
    Lambda表达式现状分析
    Node.js 0.8.18 / 0.9.7 发布
    CRUX 3.0 发布,轻量级 Linux 发行版
    Google 更新浏览器内的手写识别技术
  • 原文地址:https://www.cnblogs.com/lexus/p/2591581.html
Copyright © 2011-2022 走看看