linuxmake命令:Linux C编程---make命令的使用


=tf width="98%" align=center border=0>在开发个系统时般是将个系统分成几个模块这样做提高了系统可维护性但由于各个模块间不可避免存在关联所以当个模块改动后其他模块也许会有所更新当然对小系统来说手工编译连接是没问题但是如果是个大系统存在很多个模块那么手工编译方法就不适用了为此在Linux系统中专门提供了个make命令来自动维护目标文件与手工编译和连接相比make命令优点在于他只更新修改过文件(在Linux中个文件被创建或更新后有个最后修改时间make命令就是通过这个最后修改时间来判断此文件是否被修改)而对没修改文件则置之不理并且make命令不会漏掉个需要更新文件
A17fbaiducukfEI
    文件和文件间或模块或模块间有可能存在倚赖关系make命令也是依据这种依赖关系来进行维护所以我们有必要了解什么是依赖关系;打个最比喻:如果我们想玩游戏必须有游戏光碟和电脑(这两者间存在依赖关系)而有游戏光碟和电脑前提条件是必须经济条件允许另外当你有了游戏光碟后还要根据你心情来选择是玩哪种游戏;如下图:
A17fbaiducukfEI
 ------------------------------------
A17fbaiducukfEI
        玩游戏
A17fbaiducukfEI
         / 
A17fbaiducukfEI
        / 
A17fbaiducukfEI
   游戏光碟 电脑
A17fbaiducukfEI
      / /
A17fbaiducukfEI
     /   /
A17fbaiducukfEI
   心情 经济情况
A17fbaiducukfEI
 ------------------------------------
A17fbaiducukfEI
    make命令当然不会自己知道这些依赖关系而需要员将这些依赖关系写入个叫makefile文件中Makefile文件中包含着些目标通常目标就是文件名对每个目标提供了实现这个目标组命令以及和这个目标有依赖关系其他目标或文件名以下是个简单Makefile简单例子:
A17fbaiducukfEI
 ------------------------------------
A17fbaiducukfEI
    #个简单Makefile
A17fbaiducukfEI
    prog:prog1.o prog2.o
A17fbaiducukfEI
         gcc prog1.o prog2.o -o prog
A17fbaiducukfEI
    prog1.o:prog1.c lib.h
A17fbaiducukfEI
         gcc -c -I. -o prog1.o prog1.c
A17fbaiducukfEI
    prog2.o:prog2.c
A17fbaiducukfEI
         gcc -c prog2.c
A17fbaiducukfEI
 ------------------------------------
A17fbaiducukfEI
    以上Mamefile中定义了三个目标:prog、prog1和prog2分号后是依赖文件列表中间用个分号隔开;
A17fbaiducukfEI
对于第个目标文件prog来说他有两个依赖文件:prog1.o和prog2.o任何个依赖文件更新prog也要随之更新命令gcc prog1.o prog2.o -o prog是生成prog命令make检查目标是否需要更新时采用递归方法递归从底层向上对过时目标进行更新只有当个目标所依赖所有目标都为最新时这个目标才会被更新以上面Makefile为例我们修改了prog2.c执行make时由于目标prog依赖prog1.o和prog2.o所以要先检查prog1.o和prog2.o是否过时目标prog1.o依赖prog1.c和lib.h由于我们并没修改这两个文件所以他们都没有过期接下来再检查目标prog2.o他依赖prog2.c由于我们修改了prog2.c所以prog2.c比目标文件prog2.o要新即prog2.o过期而导致了依赖prog2.o所有目标都过时;这样make会先更新prog2.o再更新prog
A17fbaiducukfEI
    如果某行过长已经到了文本编辑器右边界可用个反斜杠()做换行符反斜杠所连接所有行都会被当成行来处理;另外在Makefile中涉及文件名允许使用通配符(?或*)
A17fbaiducukfEI
    有时候为了简化命令书写可以在Makefile中定义些宏和使用缩写下面是几个很使用缩写:
A17fbaiducukfEI
        $@ 代表该目标全名
A17fbaiducukfEI
        $* 代表已经删除了后缀目标名
A17fbaiducukfEI
        $< 代表该目标个相关目标名
A17fbaiducukfEI
    现在就可以使用缩写对以上Makefile做相应修改:
A17fbaiducukfEI
 ------------------------------------
A17fbaiducukfEI
    #使用缩写Makefile
A17fbaiducukfEI
    prog:prog1.o prog2.o
A17fbaiducukfEI
         gcc prog1.o prog2.o -o $@
A17fbaiducukfEI
    prog1.o:prog1.c lib.h
A17fbaiducukfEI
         gcc -c -I. -o $@ $<
A17fbaiducukfEI
    prog2.o:prog2.c
A17fbaiducukfEI
         gcc -c $*.c
A17fbaiducukfEI
 ------------------------------------
A17fbaiducukfEI
    在个项目中可能几个目标中使用同个文件a.c如果以后这个文件被修改那么需要修改Makefile中所有a.c这样就比较麻烦可以定义宏来解决这个问题宏可以使Makefile更加清晰:
A17fbaiducukfEI
 ------------------------------------
A17fbaiducukfEI
    #使用缩写和宏Makefile
A17fbaiducukfEI
    MARCO = prog1.o prog2.o
A17fbaiducukfEI
    prog:$(MARCO)
A17fbaiducukfEI
         gcc prog1.o prog2.o -o $@
A17fbaiducukfEI
    prog1.o:prog1.c lib.h
A17fbaiducukfEI
         gcc -c -I. -o $@ $<
A17fbaiducukfEI
    prog2.o:prog2.c
A17fbaiducukfEI
         gcc -c $*.c
A17fbaiducukfEI
 ------------------------------------
A17fbaiducukfEI
    对于很大项目来说自己手写Makefile非常麻烦而标准GNU软件(如Apacle)都是运行个configure脚本文件来产生Makefile;GNU软件automake和autoconf就是自动生成configure工具开发人员只需要先定义好宏automake处理后会产生供autoconf使用Makefine.in再用autoconf就可以产生configure要使用automake和autoconf必须安装:GNU AutomakeGNU AutoconfGNU m4perl和GNU Libtool
A17fbaiducukfEI
    假设你有个源文件test.c用autoscan可以产生个configure.scan文件编辑这个文件:
A17fbaiducukfEI
 ------------------------------------
A17fbaiducukfEI
    dnl Process this file with autoconf to produce a configure script.
A17fbaiducukfEI
    AC_INIT(test.c)
A17fbaiducukfEI
    AC_INIT_AUTOMAKE(test,1.0)
A17fbaiducukfEI
    dnl Checks for programs.
A17fbaiducukfEI
    AC_PROG_CC
A17fbaiducukfEI
    dnl Checks for libraries.
A17fbaiducukfEI

A17fbaiducukfEI
    dnl Checks for header files.
A17fbaiducukfEI

A17fbaiducukfEI
    dnl Checks for typedefs, structures, and compiler characteristics.
A17fbaiducukfEI

A17fbaiducukfEI
    dnl Checks for library functions.
A17fbaiducukfEI

A17fbaiducukfEI
    AC_OUTPUT(Makefile)
A17fbaiducukfEI
 ------------------------------------
A17fbaiducukfEI
    接着将configure.scan改名为cnfigure.in再执行aclocal和autoconf会产生aclocal.m4和configure两个文件:我们再编辑Makefile.am文件Makefile.am文件中包含了我们自己定义宏以及目标文件automake会读如这个文件并根据我们自己定义宏产生相应Makefile.in文件:
A17fbaiducukfEI
 ------------------------------------
A17fbaiducukfEI
    AUTOMAKE_OPTIONS=foreign
A17fbaiducukfEI
    run_PROG=test
A17fbaiducukfEI
    test_SOURCE=test.c
A17fbaiducukfEI
 ------------------------------------
A17fbaiducukfEI
    接下来执行automake -a到目前为止configure文件已经成功生成
Tags:  linux常用命令 linux命令 linux编程命令 linuxmake命令

延伸阅读

最新评论

发表评论