• 编译小结(6)认识Automake


           我前面说了很多如何用gcc或 Makefile怎么编译的东东,但在Linux下装过软件的都应当见过,很多源码安装的包是用Automake
    来编译的。输入下"./configure","make","make install"就装上了。Automake就是有群人觉得写Makfile不方便,特别是工程文件多
    目录复杂时。所以就搞了这么个自动生成Makefile的开源的东东。类似的工具还有cmake和qmake。
         Automake功能还是很强大的,不想手写Makefile的可以试试。
         我下面有详细说明.
    一. 详解Automake的编译做法,编译出一个可运行程序。
    二. 如何清理Automake生成的文件和目录。
    三. Automake编译中的常见问题
        测试文件:
           main.c  add.c sub.c calc.h

    一. 详解Automake的编译做法,编译出一个可运行程序。
     1. autoscan
     //扫描源代码以搜寻普通的可移植性问题,
     //比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形。
    2. cp configure.scan configure.in
    3. vi configure.in
         configure.in 文件的更改是件很麻烦的事。Automake自己定义了很多宏。而autosca生成的
        这个文件中有几个宏是必须要改的,甚至要依编译情况,还要手工加些宏在上面。
        常见的要改更的有下面几个.
               #AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
    AC_INIT(add.c,1.0)
    AM_INIT_AUTOMAKE(xcldemo,1.0)
    AC_CONFIG_SRCDIR([add.c])
    AC_CONFIG_HEADERS([config.h]) 

              //AC_OUTPUT表示最后要生成Makefile

              AC_OUTPUT(Makefile) 

    4. aclocal
     //由configure.in生成aclocal.m4
    5. //编译共享库前,运行 libtoolize -f -c 但这里好像没用
        如果少了 ltmain.sh
       就执行 libtoolize --automake --copy --debug --force
         或者 libtoolize -f -c
    6. autoconf
      //autoconf:将configure.ac中的宏展开,生成configure脚本。这个过程可能要用到aclocal.m4中定义的宏
      //由configure.in和aclocal.m4生成configure脚本
    7. 如果没有生成config.h.in,则autoheader
      
    8. vi Makefile.am
         这个文件是除了上面的configure.in以后,在Automake编译过程中要手工编写的另一个文件。
         它的作用决定了编译出来是什么样的程序,如编译出动态库还是静态库还是其它什么。
         这个文件相当蛋疼。 写法大至和手写Makefile差不多,生成定义要编译哪些文件,这些文件要引用哪些目录下的库或
         库文件。 要用到哪些编译参数等等。光这个还好说,问题是Automake还自定义了很多的宏。你要按这些宏及规则来
         写。而且你还要在这些宏前加上你要生成的库的名字。这样弄下来,个人觉得其实和单独写出个Makefile文件是一样的工作量。
    AUTOMAKE_OPTIONS=foreign
    bin_PROGRAMS=xcldemo
    xcldemo_SOURCES=main.c add.c sub.c calc.h 

    9. automake -a
        //automake --add-missing
        //由Makefile.am和configure.in生成各级目录下的Makefile.in 
    10. 执行configure生成Makefile ,ls中应当可以看到Makefile已经产生了.
        ./configure    //执行的时候会扫描各个目录下的Makefile.in生成不同的Makefile
    11. make
    12.测试编译结果
    [root@ol64 test4_auto]# ./xcldemo
    add() = 8
    sub() = 2
    MAIL:xcl_168@aliyun.com
    BLOG:http://blog.csdn.net/xcl168
    13.打包一个tar.gz
    [root@ol64 test4_auto]# make dist 
    [root@ol64 test4_auto]# ls *.tar.gz
    xcldemo-1.0.tar.gz 

    二. 如何清理Automake生成的文件和目录。
     a. 首先理解下Automake生成的目录结构
     user input files optional input processes output files
     
    ================ ============== ========= ============
     
    .——–,
     
    | | – - -> COPYING
     
    | | – - -> INSTALL
     
    | |——> install-sh
     
    | |——> missing
     
    |automake|——> mkinstalldirs
     
    configure.ac ———————–>| |
     
    Makefile.am ———————–>| |——> Makefile.in
     
    | |——> stamp-h.in
     
    .—+ | – - -> config.guess
     
    | | | – - -> config.sub
     
    | `——+-’
     
    | | – - – -> config.guess
     
    |libtoolize| – - – -> config.sub
     
    | |——–> ltmain.sh
     
    | |——–> ltconfig
     
    `———-’
    //-------------------------------------------------------------------------

    b.  理解了上面的目录结构后,就后清理了
    ##清掉Makfile生成的东东
    make clean
    ##连Makefile也清掉
    make distclean  
    ##如需要,保留输入的configure.in及Makefile.am文件
    mv configure.in configure.in_old
    mv Makefile.am Makefile.am_old
     
    ##清掉aclocal  
    rm -rf aclocal.m4
    rm -rf autom4te.cache
    rm -rf autoscan.log
     
    ##清掉autoheader 
    rm -rf config.h.in
     
    ##libtoolize
    rm -rf ltmain.sh
     
    ##automake -a
    rm -rf install-sh
    rm -rf missing
    rm -rf depcomp
     
    ##清掉.configure 
    rm -rf config.guess
    rm -rf Makefile.in
    rm -rf stamp-h1
    rm -rf .deps
    rm -rf configure
    rm -rf config.sub
    rm -rf config.status
    rm -rf configure.scan
     
    --rm -rf configure.in
     

    三.  Automake编译中的常见问题
    1.如果编译出错,可以设为成中文显示错误
       解决:
    locale -a #查看系统支持的语言
    export LANG=zh_CN.GB18030 #将系统语言改为中文

    2.编译过程中提示:
    /bin/rm: cannot remove `libtoolt': No such file or directory
     解决:
    1、确认libtool是否已经安装,如果没有安装的话,则先安装libtool
    # yum -y install libtool
    2、分别执行以下三条命令:
    # autoreconf --force --install
    # libtoolize --automake --force
    # automake --force --add-missing
    再重新编译安装,问题解决!

     3. aclocal时报下面的错误

    root@localhost OA]# aclocal
    configure.in:6: error: m4_defn: undefined macro: _m4_divert_diversion
    autoconf/general.m4:464: AC_CONFIG_SRCDIR is expanded from...
    configure.in:6: the top level
    autom4te: /usr/bin/m4 failed with exit status: 1
    aclocal: autom4te failed with exit status: 1
     解决:
         AC_INIT和AM_INIT_AUTOMAKE一定放在AC_CONFIG的前面才可以。

    4. required file `config.h.in' not found
     解决:
        在执行automake --add-missing之前执行autoheader,生成config.h.in

    MAIL: xcl_168@aliyun.com
    Blog: http://blog.csdn.net/xcl168
  • 相关阅读:
    CefSharp-基于C#的客户端开发框架技术栈开发全记录
    C#中HttpWebRequest、WebClient、HttpClient的使用详解
    蜘蛛侠网站-关注C#爬虫技术
    网络剪刀-NetCut
    JSON.stringify 格式化输出字符串
    Vue 3.0 provide 传值到子组件
    全局添加可执行的node脚本
    npm link
    低代码平台思路
    java jwt使用,springboot 整合java-jwt,java jwt工具类
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3483400.html
Copyright © 2020-2023  润新知