精华内容
下载资源
问答
  • linux中configure使用

    2011-04-09 19:29:00
    Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不 离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解...

    Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不 离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。

          与一些技巧相比,Configure显得基础一些,当然使用和学习起来就显得枯燥乏味一些,当然要成为高手,对基础的熟悉不能超越哦。

           为此我转载了一篇关于Configure选项配置的详细介绍。供大家参考

    '       configure'脚本有大量的命令行选项.对不同的软件包来说,这些选项可能会有变化,但是许多基本的选项是不会改变的.带上'-- help'选项执行'configure'脚本可以看到可用的所有选项.尽管许多选项是很少用到的,但是当你为了特殊的需求而configure一个包 时,知道他们的存在是很有益处的.下面对每一个选项进行简略的介绍:

    --cache-file=FILE

    'configure'会在你的系统上测试存在的特性(或者bug!).为了加速随后进行的配置,测试的结果会存储在一个cache file里.当configure一个每个子树里都有'configure'脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助.

    --help

          输出帮助信息.即使是有经验的用户也偶尔需要使用使用'--help'选项,因为一个复杂的项目会包含附加的选项.例如,GCC包里的 'configure'脚本就包含了允许你控制是否生成和在GCC中使用GNU汇编器的选项.

    --no-create

          'configure'中的一个主要函数会制作输出文件.此选项阻止'configure'生成这个文件.你可以认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了.

    --quiet

    --silent

           当'configure'进行他的测试时,会输出简要的信息来告诉用户正在作什么.这样作是因为'configure'可能会比较慢,没有这种输出 的话用户将会被扔在一旁疑惑正在发生什么.使用这两个选项中的任何一个都会把你扔到一旁.(译注:这两句话比较有意思,原文是这样的:If there was no such output, the user would be left wondering what is happening. By using this option, you too can be left wondering!)

    --version

    打印用来产生'configure'脚本的Autoconf的版本号.

    --prefix=PEWFIX

    '--prefix'是最常用的选项.制作出的'Makefile'会查看随此选项传递的参数,当一个包在安装时可以彻底的重新安置他的结构独立部 分. 举一个例子,当安装一个包,例如说Emacs,下面的命令将会使Emacs Lisp file被安装到"/opt/gnu/share":

    $ ./configure --prefix=/opt/gnu

    --exec-prefix=EPREFIX

    与'--prefix'选项类似,但是他是用来设置结构倚赖的文件的安装位置.编译好的'emacs'二进制文件就是这样一个问件.如果没有设置这 个选项的话,默认使用的选项值将被设为和'--prefix'选项值一样.

    --bindir=DIR

    指定二进制文件的安装位置.这里的二进制文件定义为可以被用户直接执行的程序.

    --sbindir=DIR

    指定超级二进制文件的安装位置.这是一些通常只能由超级用户执行的程序.

    --libexecdir=DIR

    指定可执行支持文件的安装位置.与二进制文件相反,这些文件从来不直接由用户执行,但是可以被上面提到的二进制文件所执行.

    --datadir=DIR

    指定通用数据文件的安装位置.

    --sysconfdir=DIR

    指定在单个机器上使用的只读数据的安装位置.

    --sharedstatedir=DIR

    指定可以在多个机器上共享的可写数据的安装位置.

    --localstatedir=DIR

    指定只能单机使用的可写数据的安装位置.

    --libdir=DIR

    指定库文件的安装位置.

    --includedir=DIR

    指定C头文件的安装位置.其他语言如C++的头文件也可以使用此选项.

    --oldincludedir=DIR

    指定为除GCC外编译器安装的C头文件的安装位置.

    --infodir=DIR

    指定Info格式文档的安装位置.Info是被GNU工程所使用的文档格式.

    --mandir=DIR

    指定手册页的安装位置.

    --srcdir=DIR

    这个选项对安装没有作用.他会告诉'configure'源码的位置.一般来说不用指定此选项,因为'configure'脚本一般和源码文件在同 一个目录下.

    --program-prefix=PREFIX

    指定将被加到所安装程序的名字上的前缀.例如,使用'--program-prefix=g'来configure一个名为'tar'的程序将会使 安装的程序被命名为'gtar'.当和其他的安装选项一起使用时,这个选项只有当他被`Makefile.in'文件使用时才会工作.

    --program-suffix=SUFFIX

    指定将被加到所安装程序的名字上的后缀.

    --program-transform-name=PROGRAM

    这里的PROGRAM是一个sed脚本.当一个程序被安装时,他的名字将经过`sed -e PROGRAM'来产生安装的名字.

    --build=BUILD

    指定软件包安装的系统平台.如果没有指定,默认值将是'--host'选项的值.

    --host=HOST

    指定软件运行的系统平台.如果没有指定,将会运行`config.guess'来检测.

    --target=GARGET

    指定软件面向(target to)的系统平台.这主要在程序语言工具如编译器和汇编器上下文中起作用.如果没有指定,默认将使用'--host'选项的值.

    --disable-FEATURE

    一些软件包可以选择这个选项来提供为大型选项的编译时配置,例如使用Kerberos认证系统或者一个实验性的编译器最优配置.如果默认是提供这些 特性,可以使用'--disable-FEATURE'来禁用它,这里'FEATURE'是特性的名字.例如:

    $ ./configure --disable-gui

    -enable-FEATURE[=ARG]

    相反的,一些软件包可能提供了一些默认被禁止的特性,可以使用'--enable-FEATURE'来起用它.这里'FEATURE'是特性的名 字.一个特性可能会接受一个可选的参数.例如:

    $ ./configure --enable-buffers=128

    `--enable-FEATURE=no'与上面提到的'--disable-FEATURE'是同义的.

    --with-PACKAGE[=ARG]

    在自由软件社区里,有使用已有软件包和库的优秀传统.当用'configure'来配置一个源码树时,可以提供其他已经安装的软件包的信息.例如, 倚赖于Tcl和Tk的BLT器件工具包.要配置BLT,可能需要给'configure'提供一些关于我们把Tcl和Tk装的何处的信息:

    $ ./configure --with-tcl=/usr/local --with-tk=/usr/local

    '--with-PACKAGE=no'与下面将提到的'--without-PACKAGE'是同义的.

    --without-PACKAGE

    有时候你可能不想让你的软件包与系统已有的软件包交互.例如,你可能不想让你的新编译器使用GNU ld.通过使用这个选项可以做到这一点:

    $ ./configure --without-gnu-ld

    --x-includes=DIR

    这个选项是'--with-PACKAGE'选项的一个特例.在Autoconf最初被开发出来时,流行使用'configure'来作为 Imake的一个变通方法来制作运行于X的软件.'--x-includes'选项提供了向'configure'脚本指明包含X11头文件的目录的方 法.

    --x-libraries=DIR

    类似的,'--x-libraries'选项提供了向'configure'脚本指明包含X11库的目录的方法.

    在源码树中运行'configure'是不必要的同时也是不好的.一个由'configure'产生的良好的'Makefile'可以构筑源码属于 另一棵树的软件包.在一个独立于源码的树中构筑派生的文件的好处是很明显的:派生的文件,如目标文件,会凌乱的散布于源码树.这也使在另一个不同的系统或 用不同的配置选项构筑同样的目标文件非常困难.建议使用三棵树:一棵源码树(source tree),一棵构筑树(build tree),一棵安装树(install tree).这里有一个很接近的例子,是使用这种方法来构筑GNU malloc包:

    $ gtar zxf mmalloc-1.0.tar.gz

    $ mkdir build && cd build

    $ ../mmalloc-1.0/configure

    creating cache ./config.cache

    checking for gcc... gcc

    checking whether the C compiler (gcc ) works... yes

    checking whether the C compiler (gcc ) is a cross-compiler... no

    checking whether we are using GNU C... yes

    checking whether gcc accepts -g... yes

    checking for a BSD compatible install... /usr/bin/install -c

    checking host system type... i586-pc-linux-gnu

    checking build system type... i586-pc-linux-gnu

    checking for ar... ar

    checking for ranlib... ranlib

    checking how to run the C preprocessor... gcc -E

    checking for unistd.h... yes

    checking for getpagesize... yes

    checking for working mmap... yes

    checking for limits.h... yes

    checking for stddef.h... yes

    updating cache ../config.cache

    creating ./config.status

    这样这棵构筑树就被配置了,下面可以继续构筑和安装这个包到默认的位置'/usr/local':

    $ make all && make install

    一个软件包通过编译源代码安装后,如何完全的卸载??

           如果原先的source还在的话,很多source的Makefile都有写uninstall规则,直接在Souce里make uninstall 就可行,不过碰到无良作者没写的,那一句一句看Makefile里install部分他都干了些什么,然后挨个删 除。

    如果source没了.....那就一边郁闷吧

           到目前为止, 我装的都可以make uninstall.......

    (因为总是不小心装错地方, 结果就make uninstall&&make clean,然后重新configure......)

    linux下软件的基本安装和卸载

           Linux软件的安装和卸载一直是困扰许多新用户的难题。在Windows中,我们可以使用软件自带的安装卸载程序或在控制面板中的“添加/删除程 序”来实现。与其相类似,在Linux下有一个功能强大的软件安装卸载工具,名为RPM 。它可以用来建立、安装、查 询、更新、卸载软件。该工具是在命令行 下使用的。在Shell的提示符后输入rpm,就可获得该命令的帮助信息。

    软件的安装

            Linux下软件的安装主要有两种不同的形式。第一种安装文件名为xxx.tar.gz ;另 一种安装文件名为xxx.i386.rpm 。以第一种方式发行的软件多为以源码形式发送的;第二种方式则是直接以二进制形式发送的。

    对于第一种,安装方法如下:

    1 .首先,将安装文件拷贝至你的目录中。例如,如果你是以root身份登录上的,就将软件拷贝至/root中。

    #cp xxx.tar.gz /root

    2 .由于该文件是被压缩并打包的,应对其解压缩。命令为:

    #tar xvzf filename.tar.gz 如果是filename.tar.bz2格式的,应该是tar jxvf filename.tar.bz2来解压

    3. 执行该命令后,安装文件按路径,解压缩在当前目录下。用ls命令可以看到解压缩后的文件。通常在解压缩后产生的文件中,有“Install”的文件。该文 件为纯文本文件,详细讲述了该软件包的安装方法。

    4.执行解压缩后产生的一个名为configure的可执行脚本程序。它是用于检查系统是否有编译时所需的库,以及库的版本是否满足编译的需要等安 装所需要的系统信息。为随后的编译工作做准备。命令为: #./configure

    如果您想把软件安装到指定目录,应该用#./configure --prefix=/您自己指定的目录,比如我想把一个mlterm安装到/opt/mlterm目录中,应该如下输入

    #./configure --prefix=/opt/mlterm

    5.检查通过后,将生成用于编译的MakeFile文件。此时,可以开始进行编译了。编译的过程视软件的规模和计算机性能的不同,所耗费的时间也不 同。命令为: #make。

    6.成功编译后,键入如下的命令开始安装:

    #make install

    7.安装完毕,应清除编译过程中产生的临时文件和配置过程中产生的文件。键入如下命令:

    #make clean

    #make distclean

    至此,软件的安装结束。

    对于第二种,其安装方法要简单得多。

    同第一种方式一样,将安装文件拷贝至你的目录中。然后使用rpm来安装该文件。命令如下:

    #rpm -i filename.i386.rpm

          rpm将自动将安装文件解包,并将软件安装到缺省的目录下。并将软件的安装信息注册到rpm的数据库中。参数i的作用是使rpm进入安装模式。

    软件的卸载

    1.软件的卸载主要是使用rpm来进行的。卸载软件首先要知道软件包在系统中注册的名称。键入命令:

    #rpm -q -a

    即可查询到当前系统中安装的所有的软件包。

    2. 确定了要卸载的软件的名称,就可以开始实际卸载该软件了。键入命令:

    #rpm -e [package name]

    即可卸载软件。参数e的作用是使rpm进入卸载模式。对名为[package name]的软件包进行卸载。由于系统中各个软件包之间相互有依赖关系。如果因存在依赖关系而不能卸载,rpm将给予提示并停止卸载。你可以使用如下的命 令来忽略依赖关系,直接开始卸载:

    #rpm -e [package name] -nodeps

    忽略依赖关系的卸载可能会导致系统中其它的一些软件无法使用

    如果想知道rpm包安装到哪里了呢?

    应该用 #rpm -ql [package name]

    3.如何卸载用源码包安装的软件?

    最好是看README和INSTALL ;一般的情况下都有说,但大多软件没有提供源码包的卸载方法;我们可以找到软件的安装点删除。主要看你把它安装在哪了。

    比如:

    如果安装软件时,指定个目录。这个问题也不会难;

    比如用源码包安装gaim 的

    #./configure --prefix=/opt/gaim

    #make

    #make install

    如果安装mlterm

    #./configure --prefix=/opt/mlterm

    #make

    #make install

    把源码包安装的软件,都指定安装在 /opt目录中,这样不就知道了??

    如果删除,就删除相应的软件目录;

    有些软件要在解压安装目录中执行 make uninstall ,这样就卸载掉了

    展开全文
  • 本文教你如何使用autoconf、automake等... 在Linux下得到一个以源代码形式发布的包(一般为.tar.gz或.tar.bz2格式),我们可以用 ./confiugure、make、make install来编译安装,其中在运行./configure的时候还可以根...

    本文教你如何使用autoconf、automake等来制作一个以源代码形式(.tar.gz)发布的软件、并可在执行configure时使用自定义参数。


    一、概述和基础知识

      在Linux下得到一个以源代码形式发布的包(一般为.tar.gz或.tar.bz2格式),我们可以用 ./confiugure、make、make install来编译安装,其中在运行./configure的时候还可以根据自己的需要加入不同的参数(可用./configure --help来查看参数表)。

      先说说执行./configure后会生成什么东西?运行后系统会根据用户的实际情况生成config.h和多个Makefile。其中Makefile是运行make时所用的模板;而config.h则会以宏(Marco)的形式记录用户的自定义参数,编译器可以根据config.h来对源代码进行预编译(pre-compile),从而生成个性化的执行档。


    二、我们的“软件”

      现在我们可以动手设计一个自己的“软件”了,为了更切合实际,将使用多个源程序,首先建立一个目录tt,用来放我们的东西,然后在tt下建立一个src目录,一般来说源代码都放在src中(好像已经成为一个不成文的规矩了:P)。整体架构如下:
      <tt>
       |-configure.in
       |-Makefile.am
       |-acconfig.h
       |-<src>
         |-tt.c
         |-qq.c
         |-qq.h
         |-Makefile.am

    ※说明:
    1. configure.in 这是最重要的文档,整个安装过程都靠它来主导。
    2. Makefile.am automake会根据它来生成Makefile.in,再由./configure 把Makefile.in变成最终的Makefile,一般来说在顶级目录和各个子目录都应该有一个Makefile.am
    3. acconfig.h autoheader会根据它来生成config.h.in,再由./configure 把config.h.in变成最终的config.h
    4. tt.c qq.c qq.h 这是我们的源程序。

    ※源代码内容:

    tt.c

    #include <stdio.h>
    #include <qq.h>
    
    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
    
    int main(void)
    {
       int a = 23;
    
       printf( "Hello, I am teacher(%d), pls tell me your names!/n", a );
    
       #ifdef POPO
       printf("My name is PoPo!/n");
       #endif
    
       qq();
    
       return 0;
    }

    qq.c

    #include <stdio.h>
    #include <qq.h>
    
    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
    
    void qq(void)
    {
       printf("My name is QQ/n");
    
       #ifdef POPO
       printf("QQ: Hey PoPo, long time no see./n");
       #endif
    }

    qq.h

    #ifndef __QQ__
    #define __QQ__
    
    void qq(void);
    
    #endif

    ※运行流程:

     1. 首先老师来点名。
     2. 如果PoPo有来的话,将会报出自己的名字。
     3. 接著轮到QQ报到,如果PoPo有来的话,QQ会向PoPo问好。

      显然易见,PoPo是否出席,完全取决于POPO这个宏(Macro)有否被定义,我们只要在编译前决定要不要定义它,就能实现不同的效果。

      如果config.h存在的话,编译时Makefile会把宏HAVE_CONFIG_H传给编译器,所以如果没有定义HAVE_CONFIG_H 的话,我们的程序不应该把config.h include进去。

    三、制作流程

    请按照以下的执行顺序一步一步做:

    第一步 编写configure.in

      生成configure.in的方法有两个,一个是自己从零开始写,另一个方法是用autoscan,执行autoscan后会生成configure.scan,其中包含了一些模板内容,使用时只要把名字改成.in就可以。

      configure.in中使用的命令有两种,一种是以AC开头,表示是由autoconf提供,另一种是以AM开头,代表由automake提供。

      在configure.in我们可以完成很多检测动作,比如检查编译所需的程式、头文件、库等等,总之功能是十分强大,不过我们这里只检测了编译器和头文件,详细用法请看 GNU Manuals Online

      以"dnl"为首的行为注释行(代码中绿色部份)。

      configure.in

    dnl 初始化autoconf,参数为入口函数所在的文件
    AC_INIT(src/tt.c)
    
    dnl 初始化automake,参数为软件名称及版本号
    AM_INIT_AUTOMAKE(tt, 0.1.0)
    
    dnl 告诉automake我们所用的配置文件,一般为config.h
    AM_CONFIG_HEADER(config.h)
    
    dnl 这里是实现自定义参数的部份,见下面的说明
    AC_ARG_ENABLE(popo, [ --enable-popo PoPo is present],,enable_popo=no)
    if test "$enable_popo" = yes ; then
       echo "PoPo is here!"
       AC_DEFINE(POPO)
    else
       echo "PoPo isn't here!"
    fi
    
    dnl 检测编译器
    AC_PROG_CC
    
    dnl 检测Standard C的头文件
    AC_HEADER_STDC
    
    dnl 输出文件,一般来说顶级目录和各子目录都应有Makefile输出
    AC_OUTPUT(Makefile src/Makefile)

     

    ./configure的自定义参数有两种,一种是开关式(--enable-XXX或--disable-XXX),另一种是开放式,即后面要填入一串字符(--with-XXX=yyyy)参数。
      上述代码中用的是开关式,第一个参数是参数名,第二个是说明(执行"./configure --help"后所显示出来的内容),最后一个参数是默认值。一般来说默认值和用户提示应该是互斥的,即默认值是no的话,应提示用户用enable进行修改,反之亦然。
      从上面的代码中可以看到,如果$enable_popo为yes的话,就用AC_DEFINE来定义POPO这个宏(Macro),否则就不定义,我们在这里所使用到的宏,一定要在acconfig.h中声明。

    第二步 运行aclocal 在tt目录下运行aclocal,将会生成aclocal.m4。

    第三步 编写acconfig.h

      在configure.in中使用到的宏(Macro),都应该在这个文件声明,一般用#undef来声明。

    acconfig.h

    #undef POPO

     


    第四步 运行autoheader

      运行autoheader后会根据configure.in、acconfig.h和系统预设的acconfig.h来生成config.h.in。

    第五步 编写Makefile.am

      一般来说,在顶级目录和各子目录都应有一个Makefile.am。


    Makefile

    AUTOMAKE_OPTIONS = foreign
    SUBDIRS = src

     

      第一行是告诉automake不要检测目录中是否存在AUTHORS、README等文件。
      第二行是告诉automake处理src这个子目录。


    src/Makefile

    AUTOMAKE_OPTIONS = foreign
    bin_PROGRAMS = tt
    tt_SOURCES = tt.c qq.c qq.h

     

      第一行作用同前。
      第二行是目标执行档的名称。
      第三行是生成tt这个执行档所需的所有源程序和头文件名称。

    第六步 运行automake

      接著可以执行automake了,在命令行下输入
        automake -a 和
        automake -a src/Makefile
      使用"automake -a"或"automake --add-missing",会自动将install.sh、mkinstalldirs等文件补齐,否则会出错,切记!

    第七步 运行autoconf

      最后,可以执行autoconf了,完成后将会生成最终的configure!


    四、编译&测试

      用默认值编译: 
    [root@chiosoft tt]# ./configure
    Checking for ......
    PoPo isn't here!
    Checking for ......

    [root@chiosoft tt]# make
    ......

    [root@chiosoft tt]# src/tt
    Hello, I am teacher(23), pls tell me your names!
    My name is QQ

     

      默认状态下,我们没有定义宏POPO,所以./configure时输出"PoPo isn't here!",运行时也只有QQ来报到。

      再看看这个: 
    [root@chiosoft tt]# ./configure --help
    ......
    --enable and --with options recognized:
     --enable-popo PoPo is present

    [root@chiosoft tt]# ./configure --enable-popo
    Checking for ......
    PoPo is here!
    Checking for ......

    [root@chiosoft tt]# make
    ......

    [root@chiosoft tt]# src/tt
    Hello, I am teacher(23), pls tell me your names!
    My name is PoPo!
    My name is QQ
    QQ: Hey PoPo, long time no see.

     

      可以看到./configure时输出"PoPo is here!",执行结果也完全不一样!

      此外,我们也可以用make install来安装,预设是安装至/usr/local/bin下,当然,这些都是可以修改的。


    五、生成发布包tarball

      好了,至今为止,我们的小软件已经测试完毕,可以发布了,在tt下有很多文件,有的是我们自己写的,也有些是编译时生成的临时档案,到底哪些需要打包到发行包中呢?当然你可以自己一个一个文件挑选,但用automake生成的Makefile提供了几个极方便的功能给我们。

      我们可以用make dist或make distcheck来生成相应的tarball,其中后者还会帮我们测试发布包能否正常工作,所以个人推荐使用make distcheck。

      看到了吧?发布包tt-0.1.0.tar.gz已经放到tt下了,有没有留意,这里用的软件名及版本号正是 configure.in中AM_INIT_AUTOMAKE所带的两个参数!现在你可以试试把它解压安装了。

    转载于:https://www.cnblogs.com/orlion/p/6091140.html

    展开全文
  • 本文教你如何使用autoconf、automake等来制作一个以... 在Linux下得到一个以源代码形式发布的包(一般为.tar.gz或.tar.bz2格式),我们可以用 ./confiugure、make、make install来编译安装,其中在运行./configure的时候

    本文教你如何使用autoconf、automake等来制作一个以源代码形式(.tar.gz)发布的软件、并可在执行configure时使用自定义参数。

    一、概述和基础知识

      在Linux下得到一个以源代码形式发布的包(一般为.tar.gz或.tar.bz2格式),我们可以用 ./confiugure、make、make install来编译安装,其中在运行./configure的时候还可以根据自己的需要加入不同的参数(可用./configure --help来查看参数表)。

      先说说执行./configure后会生成什么东西?运行后系统会根据用户的实际情况生成config.h和多个Makefile。其中 Makefile是运行make时所用的模板;而config.h则会以宏(Marco)的形式记录用户的自定义参数,编译器可以根据config.h来 对源代码进行预编译(pre-compile),从而生成个性化的执行档。


    二、我们的“软件”

      现在我们可以动手设计一个自己的“软件”了,为了更切合实际,将使用多个源程序,首先建立一个目录tt,用来放我们的东西,然后在tt下建立一个src目录,一般来说源代码都放在src中(好像已经成为一个不成文的规矩了:P)。整体架构如下:
      <tt>
       |-configure.in
       |-Makefile.am
       |-acconfig.h
       |-<src>
         |-tt.c
         |-qq.c
         |-qq.h
         |-Makefile.am

    ※说明:
    1. configure.in 这是最重要的文档,整个安装过程都靠它来主导。
    2. Makefile.am automake会根据它来生成Makefile.in,再由./configure 把Makefile.in变成最终的Makefile,一般来说在顶级目录和各个子目录都应该有一个Makefile.am
    3. acconfig.h autoheader会根据它来生成config.h.in,再由./configure 把config.h.in变成最终的config.h
    4. tt.c qq.c qq.h 这是我们的源程序。

    ※源代码内容:

    tt.c

    #include <stdio.h>
    #include <qq.h>

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif

    int main(void)
    {
       int a = 23;

       printf( "Hello, I am teacher(%d), pls tell me your names!/n", a );

       #ifdef POPO
       printf("My name is PoPo!/n");
       #endif

       qq();

       return 0;
    }

     


    qq.c

    #include <stdio.h>
    #include <qq.h>

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif

    void qq(void)
    {
       printf("My name is QQ/n");

       #ifdef POPO
       printf("QQ: Hey PoPo, long time no see./n");
       #endif
    }

     


    qq.h

    #ifndef __QQ__
    #define __QQ__

    void qq(void);

    #endif

     

     

    ※运行流程:
     1. 首先老师来点名。
     2. 如果PoPo有来的话,将会报出自己的名字。
     3. 接著轮到QQ报到,如果PoPo有来的话,QQ会向PoPo问好。

      显然易见,PoPo是否出席,完全取决于POPO这个宏(Macro)有否被定义,我们只要在编译前决定要不要定义它,就能实现不同的效果。

      如果config.h存在的话,编译时Makefile会把宏HAVE_CONFIG_H传给编译器,所以如果没有定义HAVE_CONFIG_H 的话,我们的程序不应该把config.h include进去。


    三、制作流程

    请按照以下的执行顺序一步一步做:

    第一步 编写configure.in

      生成configure.in的方法有两个,一个是自己从零开始写,另一个方法是用autoscan,执行autoscan后会生成configure.scan,其中包含了一些模板内容,使用时只要把名字改成.in就可以。

      configure.in中使用的命令有两种,一种是以AC开头,表示是由autoconf提供,另一种是以AM开头,代表由automake提供。

      在configure.in我们可以完成很多检测动作,比如检查编译所需的程式、头文件、库等等,总之功能是十分强大,不过我们这里只检测了编译器和头文件,详细用法请看 GNU Manuals Online

      以"dnl"为首的行为注释行(代码中绿色部份)。


    configure.in

    dnl 初始化autoconf,参数为入口函数所在的文件
    AC_INIT(src/tt.c)

    dnl 初始化automake,参数为软件名称及版本号
    AM_INIT_AUTOMAKE(tt, 0.1.0)

    dnl 告诉automake我们所用的配置文件,一般为config.h
    AM_CONFIG_HEADER(config.h)

    dnl 这里是实现自定义参数的部份,见下面的说明
    AC_ARG_ENABLE(popo, [ --enable-popo PoPo is present],,enable_popo=no)
    if test "$enable_popo" = yes ; then
       echo "PoPo is here!"
       AC_DEFINE(POPO)
    else
       echo "PoPo isn't here!"
    fi

    dnl 检测编译器
    AC_PROG_CC

    dnl 检测Standard C的头文件
    AC_HEADER_STDC

    dnl 输出文件,一般来说顶级目录和各子目录都应有Makefile输出
    AC_OUTPUT(Makefile src/Makefile)

     

     

      ./configure的自定义参数有两种,一种是开关式(--enable-XXX或--disable-XXX),另一种是开放式,即后面要填入一串字符(--with-XXX=yyyy)参数。
      上述代码中用的是开关式,第一个参数是参数名,第二个是说明(执行"./configure --help"后所显示出来的内容),最后一个参数是默认值。一般来说默认值和用户提示应该是互斥的,即默认值是no的话,应提示用户用enable进行修改,反之亦然。
      从上面的代码中可以看到,如果$enable_popo为yes的话,就用AC_DEFINE来定义POPO这个宏(Macro),否则就不定义,我们在这里所使用到的宏,一定要在acconfig.h中声明。

    第二步 运行aclocal 在tt目录下运行aclocal,将会生成aclocal.m4。

    第三步 编写acconfig.h

      在configure.in中使用到的宏(Macro),都应该在这个文件声明,一般用#undef来声明。

    acconfig.h

    #undef POPO

     

     

    第四步 运行autoheader

      运行autoheader后会根据configure.in、acconfig.h和系统预设的acconfig.h来生成config.h.in。

    第五步 编写Makefile.am

      一般来说,在顶级目录和各子目录都应有一个Makefile.am。


    Makefile

    AUTOMAKE_OPTIONS = foreign
    SUBDIRS = src

     


      第一行是告诉automake不要检测目录中是否存在AUTHORS、README等文件。
      第二行是告诉automake处理src这个子目录。


    src/Makefile

    AUTOMAKE_OPTIONS = foreign
    bin_PROGRAMS = tt
    tt_SOURCES = tt.c qq.c qq.h

     


      第一行作用同前。
      第二行是目标执行档的名称。
      第三行是生成tt这个执行档所需的所有源程序和头文件名称。

    第六步 运行automake

      接著可以执行automake了,在命令行下输入
        automake -a 和
        automake -a src/Makefile
      使用"automake -a"或"automake --add-missing",会自动将install.sh、mkinstalldirs等文件补齐,否则会出错,切记!

    第七步 运行autoconf

      最后,可以执行autoconf了,完成后将会生成最终的configure!


    四、编译&测试

      用默认值编译: 
    [root@chiosoft tt]# ./configure
    Checking for ......
    PoPo isn't here!
    Checking for ......

    [root@chiosoft tt]# make
    ......

    [root@chiosoft tt]# src/tt
    Hello, I am teacher(23), pls tell me your names!
    My name is QQ

     


      默认状态下,我们没有定义宏POPO,所以./configure时输出"PoPo isn't here!",运行时也只有QQ来报到。

      再看看这个: 
    [root@chiosoft tt]# ./configure --help
    ......
    --enable and --with options recognized:
     --enable-popo PoPo is present

    [root@chiosoft tt]# ./configure --enable-popo
    Checking for ......
    PoPo is here!
    Checking for ......

    [root@chiosoft tt]# make
    ......

    [root@chiosoft tt]# src/tt
    Hello, I am teacher(23), pls tell me your names!
    My name is PoPo!
    My name is QQ
    QQ: Hey PoPo, long time no see.

     


      可以看到./configure时输出"PoPo is here!",执行结果也完全不一样!

      此外,我们也可以用make install来安装,预设是安装至/usr/local/bin下,当然,这些都是可以修改的。


    五、生成发布包tarball

      好了,至今为止,我们的小软件已经测试完毕,可以发布了,在tt下有很多文件,有的是我们自己写的,也有些是编译时生成的临时档案,到底哪些需 要打包到发行包中呢?当然你可以自己一个一个文件挑选,但用automake生成的Makefile提供了几个极方便的功能给我们。

      我们可以用make dist或make distcheck来生成相应的tarball,其中后者还会帮我们测试发布包能否正常工作,所以个人推荐使用make distcheck。

      看到了吧?发布包tt-0.1.0.tar.gz已经放到tt下了,有没有留意,这里用的软件名及版本号正是 configure.in中AM_INIT_AUTOMAKE所带的两个参数!现在你可以试试把它解压安装了


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yiyepianzhou/archive/2006/08/08/1038771.aspx

    展开全文
  • 1、执行configure文件时,不带任何参数,默认新生成的文件都在执行configure命令时终端所在的目录:  如在~目录下执行~/st/tar/configure,则生成的新文件全在~目录下  解决方案:os.chdir()到configure所在目录...

    1、执行configure文件时,不带任何参数,默认新生成的文件都在执行configure命令时终端所在的目录:

      如在~目录下执行~/st/tar/configure,则生成的新文件全在~目录下

      解决方案:os.chdir()到configure所在目录,再执行os.system("./configure")

     

    2、改变文件某一行:

        将文件逐行读入list,更改要改的行,再将list内容写回文件

            content=[]
            for line in open(path,"r"):
    
                if line.startswith("string"):
    
                    line="newString"
        
                content.append(line)
    
        

     

    转载于:https://www.cnblogs.com/aldin/p/4320177.html

    展开全文
  • 本文教你如何使用autoconf、automake等来制作一个以源... 在Linux下得到一个以源代码形式发布的包(一般为.tar.gz或.tar.bz2格式),我们可以用 ./confiugure、make、make install来编译安装,其中在运行./configure
  • Linux中configure命令的一点认识

    千次阅读 2010-08-30 17:59:00
    在“Linux中搭建环境”中用到了./configure的一些简单参数,在此记录一下,方便今后使用。 首先,我们可以通过./configure --help命令查看其他可配置的参数。我用到的几个选项有:1. --prefix: 安装到指定目录2. -...
  • Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不 离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解...
  • 转自:http://blog.chinaunix.net/uid-24704319-id-2594460.html本文教你如何使用autoconf、...一、概述和基础知识 在Linux下得到一个以源代码形式发布的包(一般为.tar.gz或.tar.bz2格式),我们可以用 ./conf...
  • redhat常见的configure error的解决方法 configure: error: Unable to find libgd.(a|so) tar zxvf gd-2.0.11.tar.gz cd gd-2.0.11 sudo ./configure --prefix=/usr/local/gd2 sudo make sudo make ins...
  • 用于linux源码安装软件,一般下载源码包得到文件:xxxx.tgz ==================================== 1、解包软件 tar zxf xxxx.tgz ==================================== 2、配置 cd xxxx ./configure --...
  • Linux下得到一个以源代码形式发布的包(一般为.tar.gz或.tar.bz2格式),我们可以用 ./confiugure、make、make install来编译安装,其中在运行./configure的时候还可以根据自己的需要加入不同的参数(可用./configure...
  • Linux中configure和make

    2016-08-24 15:47:45
    Linux中利用源码包安装软件最重要的就是要仔细阅读安装包当中的README INSTALL两个说明文件,这两个文件会清楚的告诉你如何可以正确的完成这个软件的安装!  我们都知道源码包安装分为这么几个阶段, 1、 ./...
  • Linux中Configure选项配置参数详解

    千次阅读 2019-06-04 15:35:21
    Linux中Configure选项配置参数详解 Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实...
  • 2、其中configure是一个可执行脚本,在源码目录执行可以完成自动的配置工作,即./configure。 3、在实际的安装过程,我们可以增加--prefix参数,这样可以将要安装的应用安装到指定的目录,如,我们要安装git...
  • 1. `./configure --build=mipsel-linux --host=mipsel-linux --target=mipsel-linux' will build native mipsel-linux binutils on mipsel-linux.   2. `./configure --build=i386-linux --host=mipsel-linux -
  • 1. `./configure --build=mipsel-linux --host=mipsel-linux --target=mipsel-linux' will build native mipsel-linux binutils on mipsel-linux....
  • Linux交叉编译之configure

    千次阅读 2013-03-29 15:41:49
    Linux中configure提供的参数 System types: --build=BUILD configure for building on BUILD BUILD就是正在使用的机器/在build系统中建立package  这里默认就是本机 --host=HOST cross-compile to build progr
  • linux中如何重新configure(或去除已configure的文件) linux中,在安装源码软件前,需要configure命令来进行安装配置。有时configure后需要重新configure,这时需要进行一些操作,已放置出错。 以在fedora 15中...
  • linux中configure, make了解

    千次阅读 2010-12-24 16:08:00
    ./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本 configure是一个脚本,用来确定所处系统的细节,比如使用何种编译器、何种库,以及...
  • 如果配置prefix,如:./configure --prefix=/usr/local/test可以把所有资源文件放在/usr/local/test的路径,不会杂乱。 Configure是一个可执行脚本,它有很多选项,在待安装的源码路径下使用命令./configure–help...
  • linuxconfigure,pkg-config和PKG_CONFIG_PATH 1.初衷 1)前面在装gtk时冒出来一个pkg-config,当时虽然不大清楚它是个什么东西,不过大致了解了下它的作用 2)在后面的过程,又出现了configure和pkg_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,989
精华内容 1,195
关键字:

linux中configure

linux 订阅