zoukankan      html  css  js  c++  java
  • make命令小结

    1.GUN make工具在当前目录下按如下顺序搜索Makefile

        GUNmakefile

        makefile

        Makefile

    2.make的命令行选项

        命令格式            含义

         -C dir             读入指定目录下的Makefile

         -f file             读入当前目录下的file文件作为Makefile

        -i                   忽略所有的命令执行错误

        -I dir              指定被包含的Makefile所在的目录

        -n                 只打印要执行的命令,但不执行这些命令

        -p                 显示Make变量数据库和隐含规则

       -s                   在执行命令时不显示命令

        -w                  如果Make在执行过程中改变目录,则打印当前目录名


    3.Makefile的基本结构

    target:dependency_files     //目标体:依赖文件 

    <Tab>command                //命令语句

     每一个command之前必须要有Tab字符

    #的行为是进行注释

    4.Makefile变量(大小写敏感)

       object=main.o 

      hello: $(object)

                 gcc $(object) -o hello

    变量包含用户自定义的变量、预定义变量、自动变量及环境变量

                                   常见的预定义变量

          命令格式                              含义

           AR                                  归档维护程序的名称,默认值为 ar。 
      ARFLAGS                        归档维护程序的选项。 
      AS                                  汇编程序的名称,默认值为 as。 
      ASFLAGS                       汇编程序的选项。 
      CC                                   C 编译器的名称,默认值为 cc。 
      CFLAGS                          C 编译器的选项。 
      CPP                                C 预编译器的名称,默认值为 $(CC) -E。 
      CPPFLAGS                      C 预编译的选项。 
      CXX                                C++ 编译器的名称,默认值为 g++。 
      CXXFLAGS                      C++ 编译器的选项。 
      FC                                   FORTRAN 编译器的名称,默认值为 f77。 
      FFLAGS                          FORTRAN 编译器的选项。

          RM                                  文件删除程序的名称,默认值为rm -f

                                   自动变量

         命令格式                                                   含义 
      $*                                          不包含扩展名的目标文件名称。 
      $+                                         所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
      $<                                          第一个依赖文件的名称。 
      $?                                          所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
      $@                                        目标的完整名称。 
      $^                                          所有的依赖文件,以空格分开,不包含重复的依赖文件。 
      $%                                         如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为
      

    1. #makefile  
    2.   
    3. program:$(object)  
    4.        $(CC) $^ -o $@  
    5.Makefile规则

       使用隐含规则 

      如果要使用隐含规则生成你需要的目标,你所需要做的就是不要写出这个目标的规则。那么,make会试图去自动推导产生这个目标的规则和命令,如果make可以自动推导生成这个目标的规则和命令,那么这个行为就是隐含规则的自动推导。当然,隐含规则是make事先约定好的一些东西。例如,我们有下面的一个Makefile:

         foo : foo.o bar.o 
                 $(CC) foo.o bar.o  –o foo

    我们可以注意到,这个Makefile中并没有写下如何生成foo.o和bar.o这两目标的规则和命令。因为make的“隐含规则”功能会自动为我们自动去推导这两个目标的依赖目标和生成命令。

    make会在自己的“隐含规则”库中寻找可以用的规则,如果找到,那么就会使用。如果找不到,那么就会报错。在上面的那个例子中,make调用的隐含规则是,把[.o]的目标的依赖文件置成[.c],并使用C的编译命令“cc –c $(CFLAGS) [.c]”来生成[.o]的目标。也就是说,我们完全没有必要写下下面的两条规则:

         foo.o : foo.c 
                 cc –c foo.c $(CFLAGS) 
         bar.o : bar.c 
             cc –c bar.c $(CFLAGS) 

    因为,这已经是“约定”好了的事了,make和我们约定好了用C编译器“cc”生成[.o]文件的规则,这就是隐含规则。 

    当然,如果我们为[.o]文件书写了自己的规则,那么make就不会自动推导并调用隐含规则,它会按照我们写好的规则忠实地执行。 

    还有,在make的“隐含规则库”中,每一条隐含规则都在库中有其顺序,越靠前的则是越被经常使用的,所以,这会导致我们有些时候即使我们显示地指定了目标依赖,make也不会管。如下面这条规则(没有命令):

         foo.o : foo.p 

    依赖文件“foo.p”(Pascal程序的源文件)有可能变得没有意义。如果目录下存在了“foo.c”文件,那么我们的隐含规则一样会生效,并会通过“foo.c”调用C的编译器生成foo.o文件。因为,在隐含规则中,Pascal的规则出现在C的规则之后,所以,make找到可以生成foo.o的C的规则就不再寻找下一条规则了。如果你确实不希望任何隐含规则推导,那么,你就不要只写出“依赖规则”,而不写命令。

                                  Makefile中常见的隐式规则目录

                  对应语言的后缀                           规则

    C编译:“.c”变为".o"                              $(CC) -c $(CPPFLAGS) $(CFLAGS)

    C++编译:“.cc”或“.C”变为".o"               $(CXX)-c $(CPPFLAGS) $(CXXFLAGS)

    Pascal编译:“.p”变为“.o”                      $(PC)-c$(PFLAGS)

    Fortran编译:“.r”变为“.o”                       $(FC)-c $(FFLAGS)

    6.使用自动生成工具生成Makefile(使用autotools系列工具)

    安装sudo apt-get install autoconf

    参考网址:

    http://blog.chinaunix.net/uid-25100840-id-271131.html

    http://purpleroom.blog.sohu.com/133569892.html

    例子


    1. //hello.c  
    2.   
    3. #include <stdio.h>  
    4. int main()  
    5. {  
    6.     printf("Hello world!");  
    7.     return 0;  
    8. }  

    ming@ming-ThinkPad-Edge:~/workspace$ autoscan

    ming@ming-ThinkPad-Edge:~/workspace$ ls
    autoscan.log  configure.scan  hello.c 

    生成autoscan.log和configure.scan

       一、创建configure.in文件

    修改configure.scan文件

    1. #configure.scan文件内容  
    2. #       -*- Autoconf -*-  
    3. # Process this file with autoconf to produce a configure script.  
    4.   
    5. AC_PREREQ([2.68])           #表示文件要求的autoconf的版本  
    6. AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])      
    7.     #定义了程序的名称、版本、和错误报告地址,一般情况下BUG-REPORT-ADDRESS可以省略,用户可以根据自己的要求进行定制  
    8.   
    9. #另外还需要添加AM_INIT_AUTOMAKE()语句  
    10.   
    11. AC_CONFIG_SRCDIR([hello.c])   #检查原文件是否存在  
    12. AC_CONFIG_HEADERS([config.h])  #用来生成config.h文件     此句和上一句一般不用修改  
    13.   
    14. # Checks for programs.  
    15. AC_PROG_CC  
    16.   
    17. # Checks for libraries.  
    18.   
    19. # Checks for header files.  
    20.   
    21. # Checks for typedefs, structures, and compiler characteristics.  
    22.   
    23. # Checks for library functions.  
    24.   
    25. AC_OUTPUT         #用来指定生成的Makefile  

    修改后的configure.scan并将其改名为configure.in
    1. <strong>#                                               -*- Autoconf -*-  
    2. # Process this file with autoconf to produce a configure script.  
    3.   
    4. AC_PREREQ([2.68])  
    5. AC_INIT(hello, 1.0)  
    6. AM_INIT_AUTOMAKE(hello, 1.0)  
    7. AC_CONFIG_SRCDIR([hello.c])  
    8. AC_CONFIG_HEADERS([config.h])  
    9.   
    10. # Checks for programs.  
    11. AC_PROG_CC  
    12.   
    13. # Checks for libraries.  
    14.   
    15. # Checks for header files.  
    16.   
    17. # Checks for typedefs, structures, and compiler characteristics.  
    18.   
    19. # Checks for library functions.  
    20.   
    21. AC_OUTPUT(Makefile)</strong>  
            二、创建Makefile.am文件

     其内容如下

    1. <strong>AUTOMAKE_OPTIONS=foreign  
    2. bin_PROGRAMS=hello  
    3. hello_SOURCES=hello.c</strong>  

    AUTOMAKE_OPTIONS用来设置automake的软件等级,可用选项有foreign,gun,gnits.  foreign表示只检测必要文件

    bin_PROGRAMS用来指定生成的可执行文件,多个时用空格分开

    hello_SOURCES用来指定生成可执行文件的依赖文件,多个依赖文件用空格分开

         三、生成configure文件

    运行autoreconf命令即可生成

    ming@ming-ThinkPad-Edge:~/workspace$ autoreconf -fvi
    autoreconf: Entering directory `.'
    autoreconf: configure.in: not using Gettext
    autoreconf: running: aclocal --force 
    autoreconf: configure.in: tracing
    autoreconf: configure.in: not using Libtool
    autoreconf: running: /usr/bin/autoconf --force
    autoreconf: running: /usr/bin/autoheader --force
    autoreconf: running: automake --add-missing --copy --force-missing
    configure.in:6: installing `./install-sh'
    configure.in:6: installing `./missing'
    Makefile.am: installing `./depcomp'
    autoreconf: Leaving directory `.'

        四、生成Makefile文件

    通过运行configure命令即可生成Makefile文件

    ming@ming-ThinkPad-Edge:~/workspace$ ./configure
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    checking for a thread-safe mkdir -p... /bin/mkdir -p
    checking for gawk... gawk
    checking whether make sets $(MAKE)... yes
    checking for gcc... gcc
    checking whether the C compiler works... yes
    checking for C compiler default output file name... a.out
    checking for suffix of executables... 
    checking whether we are cross compiling... no
    checking for suffix of object files... o
    checking whether we are using the GNU C compiler... yes
    checking whether gcc accepts -g... yes
    checking for gcc option to accept ISO C89... none needed
    checking for style of include used by make... GNU
    checking dependency style of gcc... gcc3
    configure: creating ./config.status
    config.status: creating Makefile
    config.status: creating config.h
    config.status: executing depfiles commands

       五、执行make命令,完成

  • 相关阅读:
    mysql 自定义排序
    arcgis 好人
    eclipse启动tomcat,提示三个端口均被占用
    oracle 查看表空间创建日期
    navacat 链接oracle oci invalid handle
    java +mysql 递归排序/* START WITH aa.parentid IN ( 10000, 20000, 30000, 40000, 50000, 60000, 70000 ) connect BY prior aa.id = aa.parentid ORDER siblings BY aa.id ASC*/ to
    Double 转 BigDecimal
    mysql 死锁 Waiting for stored function metadata lock
    Graphtree--zabbix增强功能(一屏展示所有内容)
    zabbix 分布式监控(proxy)源码安装
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318924.html
Copyright © 2011-2022 走看看