zoukankan      html  css  js  c++  java
  • GNU的make命令、makefile编写

    makefile简介


    • makefile可实现工程的自动化编译,只需一个make命令即可一键完成。makefile定义了一些规则,指定哪些文件需要先编译、后编译、重新编译等。

    • 一般的C或者C++程序,都需要先编译成中间文件,windows下为.obj文件,UNIX下为.o文件,这个过程称为编译(compile)。

    • 每个原文件都应该对应一个中间文件(.obj文件或者.o文件),把大量的中间文件合成执行文件的过程,称为链接(Link);链接时,主要是链接函数和变量,即可以使用.obj文件或者.o文件链接应用程序。链接器只关系函数的中间文件,不关心源文件的位置,为了避免大量的中间文件的复杂管理,需给中间文件打包,windows下称为库文件(Library File),即.lib文件,UNIX下为Archive File,即 .a文件。

    makefile规则


    流程

    目标 : 需要的条件(注意 : 两边的空格)
        命令(以Tab键开头)
    

    解释一下:

    • 目标 可以是一个或者多个,可以是ObjectFile文件、执行文件、甚至标签
    • 条件 指的是 依赖的文件或者目标
    • 命令 指的是 生成目标需要执行的脚本

    总结:即一条makefile规则定义了编译的依赖关系,目标文件依赖于条件,生成规则用命令

    举个例子

    objects = main.o kbd.o command.o display.o /
                  insert.o search.o files.o utils.o
        edit : $(objects)
                cc -o edit $(objects)
        main.o : main.c defs.h
                cc -c main.c
        kbd.o : kbd.c defs.h command.h
                cc -c kbd.c
        command.o : command.c defs.h command.h
                cc -c command.c
        display.o : display.c defs.h buffer.h
                cc -c display.c
        insert.o : insert.c defs.h buffer.h
                cc -c insert.c
        search.o : search.c defs.h buffer.h
                cc -c search.c
        files.o : files.c defs.h buffer.h command.h
                cc -c files.c
        utils.o : utils.c defs.h
                cc -c utils.c
        clean :
                rm edit $(objects)
    

    make命令


    1. 首先在当前目录下寻找"makefile"或者"Makefile"文件找到,则定位到第一个目标文件(target),上例中,会找到"edit"文件,并把此文件作为最终目标文件
    2. 若eidt文件不存在,或者eidt后依赖的.o文件的修改时间比edit文件新,则执行后面定义的命令生成edit文件
    3. 若edit后依赖的.o文件也不存在,make会在当前文件中寻找.o文件的依赖性,若找到,则根据那个规则生成.o文件.c和.h文件存在,make生成.o文件,最后执行edit

    自动推导

    GNU的make命令支持自动推导,只要make看到一个.o文件,就会自动把.c文件加到依赖关系中,则上述例子可简化为以下形式

    objects = main.o kbd.o command.o display.o /
                  insert.o search.o files.o utils.o
        edit : $(objects)
                cc -o edit $(objects)
    
        main.o : defs.h
        kbd.o : defs.h command.h
        command.o : defs.h command.h
        display.o : defs.h buffer.h
        insert.o : defs.h buffer.h
        search.o : defs.h buffer.h
        files.o : defs.h buffer.h command.h
        utils.o : defs.h
      clean :
                rm edit $(objects)
    

    文件功能

    make支持多文件共简规则,上述例子可进一步简化为如下形式(但不推荐,因为较难维护)

    objects = main.o kbd.o command.o display.o /
                  insert.o search.o files.o utils.o
        edit : $(objects)
                cc -o edit $(objects)
    
        $(objects) : defs.h
        kbd.o command.o files.o : command.h
        display.o insert.o search.o files.o : buffer.h
        clean :
                rm edit $(objects)
    

    清空目标文件规则

    每一个makefile文件都应该清楚的写一个清空目标的(.o和执行文件)规则,有利于重编译和文件的清结性。

    .PHONY表示clean是一个"伪目标",rm前的减号表示,某些文件出问题但是不要管,继续往下走。

    clean默认放在文件尾,不然会被当作默认目标。

     `一般的风格为:`
    clean:
                rm edit $(objects)
    `较为稳健的方法:`
    .PHONY : clean
            clean :
                    -rm edit $(objects)
    

    make编译安装

    流程

    • 首先下载.tar.gz或者.tar.bz2软件包文件

    • 使用tar命令解压

    • 进入到解压后文件目录(因为make是搜索当前文件位置)

    • 使用./configure -prefix={Your Install Path} (其他configure参数自行百度)

    • make编译(或者使用make all,过程有时很慢,有时会报错,可能是依赖包的问题,解决依赖关系即可)

    • make install 安装(需足够权限,部分软件需要make check 或者 make test 进行测试)

    • make clean 清除编译产生的中间文件(Objectfile或者.o文件)

    举个例子

    //1.解压缩
    tar -zxf xxxxx-4.0.2.tar.gz  
    //2.进入目录
    cd xxxxx-4.0.2
    //3.配置
    ./configure --prefix=/usr/local/xxxxx     
    //4.编译
    make all
    //5.安装
    make install && make install-init && make install-commandmode && make install-config
    //6.清除中间文件
    make clean
    

    相关链接

  • 相关阅读:
    程序员的困境
    linux中获取系统时间 gettimeofday函数
    Vim 模式及常用命令整理
    使用stringstream进行类型转换与字符串分割
    EasyNet开源项目计划
    用Akka构建一个简易的分布式文件系统
    SolrCloud攻略
    EasyNet.Solr 4.4.0发布及例子
    axis2调用webservice
    Oracle常用函数2查询
  • 原文地址:https://www.cnblogs.com/CocoML/p/12747072.html
Copyright © 2011-2022 走看看