精华内容
下载资源
问答
  • PHP编译configure时常见错误的总结 ...其实不管是你是Apache类... 本文总结了一些常见的configure错误信息和解决这些错误的经验。 1、configure: error: No curses/termcap library found 网上有的说法是:–with-named-c
  • VMware vSphere: Install, Configure, Manage
  • 主要介绍了安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
  • Configure EndNote.exe

    2019-05-26 11:21:11
    破解版ENDNOTE X7 强大的文献检索工具,灵活插入并编辑参看文献,与word嵌合后使用及其方便
  • VMware vSphere:Install,Configure,Manage vcp有实验手册-VSICM7-LAB-IE VMware vSphere:Install,Configure,Manage vcp有实验手册-VSICM7-LAB-IE
  • 详细介绍了configure得各个选项得意思,和使用得方法。同时在config.log里面可以详细看到configure得错误,做对应得修改
  • configure error gyp ERR! stack Error: EACCES: permission denied, mkdir ‘/Users/mac-pro/.nvm/versions/node/v10.16.0/lib/node_modules/webpack/node_modules/fsevents/build’ gyp ERR! System Darwin ...
  • 串口模拟软件 Configure Virtual Serial Port Driver ,亲测可用,安装完后,使用Cracked目录下的文件替换安装目录下的文件即可
  • 当您要编写configure.win时,可能无法使用用于生成configure脚本的相同工具(例如 )。 该软件包旨在通过以下方法解决该问题: 允许您直接使用R配置R软件包; 和 提供一组用于完成常见配置任务的功能。 用法 首先...
  • Nginx在configure时的初选参数,请提前建立nginx用户并-s设置/sbin/nologin
  • libmodbus最新版,解决了原资源中configure.js运行错误
  • vim configure

    2015-07-27 17:36:07
    VIM configure files, containing ctags, cscope configuration, and taglist and NERDtree plugins.
  • VMware vSphere Install Configure Manage V6.5_lab manual
  • configure.properties

    2021-01-12 10:07:06
    configure.properties
  • [52bluetooth.com]AB1520 Series Configure Tool User Guide Prev031
  • GitHub的上没有configure,官网试了好多次才打开成功并下载下来
  • Qt5 configure参数说明文档

    热门讨论 2014-03-04 22:45:35
    Qt5 configure参数说明文档。Qt5源码VS下编译参考:http://blog.csdn.net/phil2036/article/details/20409535
  • 云盘满了没地方放了就只好放这儿了。
  • 在myeclipse中,在项目上右键Configure->Convert to Maven Project,但是现在使用的是MyEclipse,在项目上右键,没有发现Configure菜单
  • Switch#configure terminal Switch(config)#vlan 10 Switch(config-vlan)#name test Switch(config-vlan)#interface f0/5 Switch(config-if)#switchport access vlan 10 Switch(config-if)#end Switch#configure ...
  • MAC环境下编译apr所需要用的configure文件。我写的blog中提及的configure文件。
  • 编写configure.ac

    千次阅读 2019-08-16 13:30:40
    一、configure.ac configure.ac由一些宏组成(如果已经有源代码,你可以运行autoscan来产生一个configure.scan文件,在此基础修改成configure.ac将更加方便) 1) 示列 AC_INIT([amhello], [1.0], [bug-automake@...

    一、configure.ac

    autoconf 官方文档
    automake 官方文档
    libtool 官方文档
    gnu官网

    configure.ac由一些宏组成(如果已经有源代码,你可以运行autoscan *来产生一个configure.scan文件,在此基础修改成configure.ac将更加方便)

    1) 示列

    AC_PREREQ(2.61)
    AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
    AM_INIT_AUTOMAKE([-Wall -Werror foreign])
    AC_PROG_CC
    AC_CONFIG_HEADERS([config.h])
    AC_CONFIG_FILES([
     Makefile
     src/Makefile
    ])
    AC_OUTPUT
    

    2)可能出现的配置

    2.1 AC_PREREQ(VERSION)

    指示使用的autoconf的版本。

    2.2 AC_INIT(PACKAGE, VERSION, BUG-REPORT-ADDRESS)

    autoconf 强制性初始化。告诉autoconf包名称,版本,一个bug报告emall。
    例如:

    AC_INIT([hello], [1.0], [bug-report@address])
    

    并且这些名称将出现在config.h,你可以在程序直接引用这些宏。

    /* config.h.  Generated from config.h.in by configure.  */
    /* config.h.in.  Generated from configure.ac by autoheader.  */
    
    /* Name of package */
    #define PACKAGE "amhello"
    
    /* Define to the address where bug reports for this package should be sent. */
    #define PACKAGE_BUGREPORT "bug-automake@gnu.org"
    
    /* Define to the full name of this package. */
    #define PACKAGE_NAME "amhello"
    
    /* Define to the full name and version of this package. */
    #define PACKAGE_STRING "amhello 1.0"
    
    /* Define to the one symbol short name of this package. */
    #define PACKAGE_TARNAME "amhello"
    
    /* Define to the home page for this package. */
    #define PACKAGE_URL ""
    
    /* Define to the version of this package. */
    #define PACKAGE_VERSION "1.0"
    
    /* Version number of package */
    #define VERSION "1.0"
    

    2.3 AM_INIT_AUTOMAKE([OPTIONS…])

    检查automake尝试Makefile时的必要的工具。 例如:AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])

    一些可选的选项:

    选项解释
    -Wall打开全部警告
    -Werror将警告当错误处理
    -foreign放宽一些GNU标准需求
    -1.11.1需要automake的最低版本
    -dist-bzip2在使用make dist和make distcheck期间同时创建tar.bz2存档
    -tar-ustar使用ustar格式创建tar存档

    2.4 AC_CONFIG_SRCDIR(FILE)

    一个安全的检查。FILE将是一个发布的源文件。这让configure脚本确保自己运行在正确的目录中。如:AC_CONFIG_SRCDIR([src/main.c])

    2.5 AC_CONFIG_AUX_DIR(DIRECTORY)

    配置辅助脚本位置,如install-sh和depcomp等。如:AC_CONFIG_AUX_DIR([build-aux])

    2.6 AC_PROG_CC, AC_PROG_CXX, AC_PROG_F77, …

    编译器检测。

    2.7 AC_PROG_SED, AC_PROG_YACC, AC_PROG_LEX, …

    发现好的实现并且设置变量SED,YACC,$LEX等。

    2.8 AC_CHECK_PROGS(VAR, PROGS, [VAL-IF-NOT-FOUND])

    将VAR定义为第一个发现的程序,如果没有发现就设置为VAL-IF-NOT-FOUND

    AC_CHECK_PROGS([TAR], [tar gtar], [:])
    if test "$TAR" = :; then
    AC_MSG_ERROR([This package needs tar.])
    fi
    

    如果发现tar,gtar,就设置到变量$TAR中,如果没有发现就是设置为‘:’

    2.9 AC_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS])

    打印错误信息ERROR-DESCRIPTION并退出,EXIT-STATUS设置退出状态。

    2.10 AC_MSG_WARN(ERROR-DESCRIPTION)

    打印但是不退出。

    2.11 AC_DEFINE(VARIABLE, VALUE, DESCRIPTION)

    输出到configu.h中。

    /* DESCRIPTION */
    #define VARIABLE VALUE
    

    2.12 AC_SUBST(VARIABLE, [VALUE])

    定义变量$VARIABLE=VALUE,进入Makefile。
    如:AC_SUBST([FOO],[foo])
    等价于
    FOO=foo
    AC_SUBST([FOO])
    或者
    AC_SUBST([FOO])
    FOO=foo

    2.13 AC_CHECK_LIB(LIBRARY, FUNCT, [ACT-IF-FOUND], [ACT-IF-NOT])

    检查库是否存在并且包括函数FUNCT。如果发现库就执行ACT-IF-FOUND,否则执行ACT-IF-NOT。
    例如:

    AC_CHECK_LIB([efence], [malloc], [EFENCELIB=-lefence])
    AC_SUBST([EFENCELIB])
    

    稍后可以使用(EFENCELIB)在链接规则中。如果没有使用ACT−IF−FOUND项,并且库被发现存在。ACCHECKLIB将会做下面的操作,LIBS=”−lLIBRARY(EFENCELIB)在链接规则中。如果没有使用ACT−IF−FOUND项,并且库被发现存在。ACCHECKLIB将会做下面的操作,LIBS=”−lLIBRARYLIBS"和#dedefine HAVE_LIB{LIBRARY}。Autmake会在链接的时候使用$LIBS。

    2.14 AC_CHECK_HEADERS(HEADERS…)

    检查头HEADERS并且给每一个发现的头文件定义#define HAVE_HEADER_H
    例如:

    AC_CHECK_HEADERS([unistd.h windows.h])
    

    这个宏将在当前建造环境下检查unistd.h,windows.h是否存在。并将两个参数写入到配置头文件中。一般是config.h,你可以使用AC_CONFIG_HEADERS([headers])来指定。

    AC_CONFIG_HEADERS([config.h])
    

    如果存在就会出现在config.h中例如下面:

    /* Define to 1 if you have the <unistd.h> header file. */
    #define HAVE_UNISTD_H 1
    
    /* Define to 1 if you have the <windows.h> header file. */
    #define HAVE_WINDOWS_H 1
    

    2.15 AC_CHECK_HEADER(HEADER, [ACT-IF-FOUND], [ACT-IF-NOT])

    检查一个头文件。

    2.16 AC_CONFIG_HEADERS(HEADERS…)

    创建头文件的HEADER.in,HEADERS包含使用AC_DEFINE的定义。
    例如:
    AC_CONFIG_HEADERS([config.h])
    将从config.h.in创建config.h。

    2.17 AC_CONFIG_FILES([Makefile sub/Makefile script.sh:script.in])

    Automake创建FILE.in从每一个有FILE.am的FILE。他也可以出来非Makefile。
    script.in

    #!/bin/sh
    SED='@SED@'
    TAR='@TAR@'
    d=$1; shift; mkdir "$d"
    for f; do
    "$SED" 's/#.*//' "$f" \
    >"$d/$f"
    done
    "$TAR" cf "$d.tar" "$d"
    

    .in是文件模板。@SED@、@TAR@将被AC_SUBST([SED]),AC_SUBST([TAR])替换。这样你就可以将配置中的变量传送到其他文件中去。
    Makefile.in也使用@XYZ@作为替换部分,但是Automake已经做了将所有的XYZ=@XYZ@的定义,你只需要简单使用$(XYZ)就可以了。

    2.18 AC_CONFIG_FILES([Makefile sub/Makefile])

    写入Makefile.am和sub/Makefile.am文件

    2.19 AM CONDITIONAL(NAME, CONDITION)

    定义一个条件名NAME,CONDITION将由shell解释执行,如果成功NAME将被打开。
    举例:configure.ac

    AC_CHECK_HEADER([bar.h], [use_bar=yes])
    AM_CONDITIONAL([WANT_BAR], [test "$use_bar" = yes])
    

    仅当当前系统中存在bar.h文件时打开WANT_BAR。

    2.20 AC_CHECK_FUNC (function, [action-if-found], [action-if-not-found])
    AC_CHECK_FUNCS (function…, [action-if-found], [action-if-not-found])

    检查函数是否存在,如果存在执行动作action-if-found,没有发现执行动作action-if-not-found。
    如果你没给出action-if-found和action-if-not-found,在发现函数的时候回定义对应的变量,以HAVE_开头,函数的名称都转换成大写。例如:

    AC_CHECK_FUNCS(perror gettimeofday clock_gettime memset socket getifaddrs freeifaddrs fork)
    

    如果发现clock_gettime将会定义变量#define HAVE_CLOCK_GETTIME 1在对应的配置头文件中。
    如果没发现将不会定义。但是也会有一个注释行/* #undef HAVE_CLOCK_GETTIME */

    2.21 AC_ARG_WITH (package, help-string, [action-if-given], [action-if-not-given])

    这个宏可以给configure增加–with-package这样模式的参数。很多软件都有可选项用来打开扩展功能,AC_ARG_WITH就是干这个的。它的第一参数给出扩展包的名称,出现在–with-后面。第二个参数给出一个参数说明,用在./configure –help中。[action-if-given]如果有该选项就被执行,[action-if-not-given]如果没有加这个选项就执行。
    例如:

    AC_ARG_WITH([militant],
        [AS_HELP_STRING([--with-militant],
            [Enable militant API assertions])],
        [zmq_militant="yes"],
        [])
    
    if test "x$zmq_militant" = "xyes"; then
        AC_DEFINE(ZMQ_ACT_MILITANT, 1, [Enable militant API assertions])
    fi
    

    AS_HELP_STRING([–with-militant],
    [Enable militant API assertions])
    定义一个帮助字串,将在configure –help中被显示出来。
    它可以这么使用configure –width-militant,这导致zmq_militant=”yes”被执行,随后通过测试来定义一个变量ZMQ_ACT_MILITANT=1。

    2.22 AC_DEFINE(VARIABLE, VALUE, DESCRIPTION)

    这个宏会在AC_CONFIG_HEADERS定义的头文件中增加一个定义项。例如:

    /* DESCRIPTION */
    #define VARIABLE VALUE 
    

    另外使用AC_ARG_ENABLE宏可以为configure增加–enable-feature 或者 –disable-feature这样的选项。

    2.23 AC_ARG_ENABLE (feature, help-string, [action-if-given], [action-if-not-given])

    如果configure中加了给定的选项,就执行action-if-given,否则执行action-if-not-given。
    例如:

    AC_ARG_ENABLE([eventfd],
        [AS_HELP_STRING([--disable-eventfd], [disable eventfd [default=no]])],
        [zmq_enable_eventfd=$enableval],
        [zmq_enable_eventfd=yes])
    
    if test "x$zmq_enable_eventfd" = "xyes"; then
        # Check if we have eventfd.h header file.
        AC_CHECK_HEADERS(sys/eventfd.h,
            [AC_DEFINE(ZMQ_HAVE_EVENTFD, 1, [Have eventfd extension.])])
    fi
    

    2.24 共享库和静态库

    编译动态库或者静态库,你需要再你的configure.ac中加入下面的宏:

    LT_PREREQ([2.4.0])
    LT_INIT([disable-static win32-dll dlopen])
    AC_PROG_LIBTOOL
    

    LT_PREREQ给出一个版本需求检查。LT_INIT可以实现一些配置,例如win32-dll允许建造动态库,disable-static默认关闭静态库的建造。默认动态库和静态库是同时打开的。
    AC_PROG_LIBTOOL检查libtool脚本。做完这些在你的configure中会增加一些选项–enable-static , –enable-shared。
    细节参数可以看:libtool 官方文档

    2.25 AC_RUN_IFELSE (input, [action-if-true], [action-if-false], [action-if-cross-compiling = ‘AC_MSG_FAILURE’])

    编译运行input程序,如果程序成功运行返回0,执行action-if-true,否则执行action-if-false。如果交叉编译打开,那么编译出来的代码不能在本机执行,这时其他的动作都不会执行,如果action-if-cross-compiling存在将被执行。
    另外这里的input必须是有一个宏指定的源代码。 AC_LANG_PROGRAM (prologue, body)
    例如:

    [AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]],
                          [[fputs (hw, stdout);]])])
    

    将被展开为下面的代码:

    #define PACKAGE_NAME "Hello"
    #define PACKAGE_TARNAME "hello"
    #define PACKAGE_VERSION "1.0"
    #define PACKAGE_STRING "Hello 1.0"
    #define PACKAGE_BUGREPORT "bug-hello@example.org"
    #define PACKAGE_URL "http://www.example.org/"
    #define HELLO_WORLD "Hello, World\n"
    
    const char hw[] = "Hello, World\n";
    int
    main ()
    {
    fputs (hw, stdout);
      ;
      return 0;
    }
    

    下面看一个完整的例子:

    AC_MSG_CHECKING([if TIPC is available and supports nonblocking connect])
    
    AC_RUN_IFELSE(
        [AC_LANG_PROGRAM([[
                #include <stdlib.h>
                #include <string.h>
                #include <fcntl.h>
                #include <errno.h>
                #include <sys/socket.h>
                #include <linux/tipc.h>
            ]],[[
                struct sockaddr_tipc topsrv;
                int sd = socket(AF_TIPC, SOCK_SEQPACKET, 0);
                if (sd == -EAFNOSUPPORT) {
                    return 1;
                }
                memset(&topsrv, 0, sizeof(topsrv));
                topsrv.family = AF_TIPC;
                topsrv.addrtype = TIPC_ADDR_NAME;
                topsrv.addr.name.name.type = TIPC_TOP_SRV;
                topsrv.addr.name.name.instance = TIPC_TOP_SRV;
                fcntl(sd, F_SETFL, O_NONBLOCK);
                if (connect(sd, (struct sockaddr *)&topsrv, sizeof(topsrv)) != 0) {
                    if (errno != EINPROGRESS)
                        return -1;
                }
            ]])
        ],
        [libzmq_tipc_support=yes],
        [libzmq_tipc_support=no],
        [libzmq_tipc_support=no])
    
    AC_MSG_RESULT([$libzmq_tipc_support])
    

    AC_MSG_CHECKING和AC_MSG_RESULT共同显示一个检查信息。这些信息将显示在执行configure脚本时。
    上面的宏在编译执行完给定代码后,如何成功就执行libzmq_tipc_support=yes,这同样导致configure打印一个信息if TIPC is available and supports nonblocking connect : yes
    下面你可以使用libzmq_tipc_support来定义一个宏到头文件中。

    if test "x$libzmq_tipc_support" = "xyes"; then
        AC_DEFINE(ZMQ_HAVE_TIPC, 1, [Have TIPC support])
    fi
    
    展开全文
  • configure文件的生成

    千次阅读 2019-03-15 11:30:54
    使用automake,程序开发人员只需要写一些简单的含有预定义宏的文件,由autoconf根据一个宏文件生成configure,由 automake根据另一个宏文件生成Makefile.in,再使用configure依据Makefile.in来生成一个符合惯例的 ...

    作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便。一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了。 

    在本文中,将给大家介绍如何使用autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用“./configure”,“make”,“make instal”就可以把程序安装到Linux系统中去了。这将特别适合想做开放源代码软件的程序开发人员,又或如果你只是自己写些小的Toy程序,那么这个文章对你也会有很大的帮助。 

    一、Makefile介绍 
    Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中纪录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。 

    Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。 

    Makefile的基本结构不是很复杂,但当一个程序开发人员开始写Makefile时,经常会怀疑自己写的是否符合惯例,而且自己写的Makefile 经常和自己的开发环境相关联,当系统环境变量或路径发生了变化后,Makefile可能还要跟着修改。这样就造成了手工书写Makefile的诸多问题,automake恰好能很好地帮助我们解决这些问题。 

    使用automake,程序开发人员只需要写一些简单的含有预定义宏的文件,由autoconf根据一个宏文件生成configure,由 automake根据另一个宏文件生成Makefile.in,再使用configure依据Makefile.in来生成一个符合惯例的 Makefile。下面我们将详细介绍Makefile的automake生成方法。 

    二、使用的环境 
    本文所提到的程序是基于Linux发行版本:Fedora Core release 1,它包含了我们要用到的autoconf,automake。

    三、从helloworld入手 
    我们从大家最常使用的例子程序helloworld开始。 

    下面的过程如果简单地说来就是: 

    新建三个文件: 
    helloworld.c 
    configure.in 
    Makefile.am 
    然后执行: 
    aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld 

    就可以看到Makefile被产生出来,而且可以将helloworld.c编译通过。 
    很简单吧,几条命令就可以做出一个符合惯例的Makefile,感觉如何呀。 

    现在开始介绍详细的过程: 

    1、建目录 
    在你的工作目录下建一个helloworld目录,我们用它来存放helloworld程序及相关文件,如在/home/my/build下: 
    $ mkdir helloword 
    $ cd helloworld 

    2、 helloworld.c 
    然后用你自己最喜欢的编辑器写一个hellowrold.c文件,如命令:vi helloworld.c。使用下面的代码作为helloworld.c的内容。 
    int main(int argc, char** argv) 

    printf("Hello, Linux World!n"); 
    return 0; 


    完成后保存退出。 

    现在在helloworld目录下就应该有一个你自己写的helloworld.c了。 

    3、生成configure 
    我们使用autoscan命令来帮助我们根据目录下的源代码生成一个configure.in的模板文件。 
    命令: 
    $ autoscan 
    $ ls 
    configure.scan helloworld.c 

    执行后在hellowrold目录下会生成一个文件:configure.scan,我们可以拿它作为configure.in的蓝本。 
    现在将configure.scan改名为configure.in,并且编辑它,按下面的内容修改,去掉无关的语句: 

    ============================configure.in内容开始========================================= 
    # -*- Autoconf -*- 
    # Process this file with autoconf to produce a configure script. 

    AC_INIT(helloworld.c) 
    AM_INIT_AUTOMAKE(helloworld, 1.0) 

    # Checks for programs. 
    AC_PROG_CC 

    # Checks for libraries. 

    # Checks for header files. 

    # Checks for typedefs, structures, and compiler characteristics. 

    # Checks for library functions. 
    AC_OUTPUT(Makefile) 
    ============================configure.in内容结束========================================= 

    然后执行命令aclocal和autoconf,分别会产生aclocal.m4及configure两个文件: 

    $ aclocal 
    $ls 
    aclocal.m4 configure.in helloworld.c 
    $ autoconf 
    $ ls 
    aclocal.m4 autom4te.cache configure configure.in helloworld.c 

    大家可以看到configure.in内容是一些宏定义,这些宏经autoconf处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。 

    autoconf 是用来生成自动配置软件源代码脚本(configure)的工具。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预。 

    要生成configure文件,你必须告诉autoconf如何找到你所用的宏。方式是使用aclocal程序来生成你的aclocal.m4。 

    aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。 

    autoconf从configure.in这个列举编译软件时所需要各种参数的模板文件中创建configure。 

    autoconf需要GNU m4宏处理器来处理aclocal.m4,生成configure脚本。 

    m4是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。m4既可以作为编译器的前端,也可以单独作为一个宏处理器。 

    4、新建Makefile.am 
    新建Makefile.am文件,命令: 
    $ vi Makefile.am 
    内容如下: 
    AUTOMAKE_OPTIONS=foreign 
    bin_PROGRAMS=helloworld 
    helloworld_SOURCES=helloworld.c 

    automake会根据你写的Makefile.am来自动生成Makefile.in。 
    Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成。 

    5、运行automake 
    命令: 
    $ automake --add-missing 
    configure.in: installing `./install-sh' 
    configure.in: installing `./mkinstalldirs' 
    configure.in: installing `./missing' 
    Makefile.am: installing `./depcomp' 

    automake会根据Makefile.am文件产生一些文件,包含最重要的Makefile.in。 

    6、执行configure生成Makefile 
    $ ./configure 
    checking for a BSD-compatible install... /usr/bin/install -c 
    checking whether build environment is sane... yes 
    checking for gawk... gawk 
    checking whether make sets $(MAKE)... yes 
    checking for gcc... gcc 
    checking for C compiler default output... a.out 
    checking whether the C compiler works... yes 
    checking whether we are cross compiling... no 
    checking for suffix of executables... 
    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 ANSI C... 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: executing depfiles commands 
    $ ls -l Makefile 
    -rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile 
    你可以看到,此时Makefile已经产生出来了。 

    7、使用Makefile编译代码 
    $ make 
    if gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" - 

    DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="helloworld" -DVERSION="1.0" 

    -I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" 
    -c -o helloworld.o `test -f 'helloworld.c' || echo './'`helloworld.c; 
    then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; 
    else rm -f ".deps/helloworld.Tpo"; exit 1; 
    fi 
    gcc -g -O2 -o helloworld helloworld.o 

    运行helloworld 

    $ ./helloworld 
    Hello, Linux World! 


    这样helloworld就编译出来了,你如果按上面的步骤来做的话,应该也会很容易地编译出正确的helloworld文件。你还可以试着使用一些其他的make命令,如make clean,make install,make dist,看看它们会给你什么样的效果。感觉如何?自己也能写出这么专业的Makefile,老板一定会对你刮目相看。 

    四、深入浅出 
    针对上面提到的各个命令,我们再做些详细的介绍。 

    1、 autoscan 
    autoscan是用来扫描源代码目录生成configure.scan文件的。autoscan可以用目录名做为参数,但如果你不使用参数的话,那么 autoscan将认为使用的是当前目录。autoscan将扫描你所指定目录中的源文件,并创建configure.scan文件。 

    2、 configure.scan 
    configure.scan包含了系统配置的基本选项,里面都是一些宏定义。我们需要将它改名为configure.in 

    3、 aclocal 
    aclocal是一个perl 脚本程序。aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。 

    4、 autoconf 
    autoconf是用来产生configure文件的。configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。 

    configure.in文件的内容是一些宏,这些宏经过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。 

    在configure.ini中: 
    #号表示注释,这个宏后面的内容将被忽略。 


    AC_INIT(FILE) 
    这个宏用来检查源代码所在的路径。 


    AM_INIT_AUTOMAKE(PACKAGE, VERSION) 
    这个宏是必须的,它描述了我们将要生成的软件包的名字及其版本号:PACKAGE是软件包的名字,VERSION是版本号。当你使用make dist命令时,它会给你生成一个类似helloworld-1.0.tar.gz的软件发行包,其中就有对应的软件包的名字和版本号。 

    AC_PROG_CC 
    这个宏将检查系统所用的C编译器。 

    AC_OUTPUT(FILE) 
    这个宏是我们要输出的Makefile的名字。 

    我们在使用automake时,实际上还需要用到其他的一些宏,但我们可以用aclocal 来帮我们自动产生。执行aclocal后我们会得到aclocal.m4文件。 
    产生了configure.in和aclocal.m4 两个宏文件后,我们就可以使用autoconf来产生configure文件了。 

    5、 Makefile.am 
    Makefile.am是用来生成Makefile.in的,需要你手工书写。Makefile.am中定义了一些内容: 

    AUTOMAKE_OPTIONS 
    这个是automake的选项。在执行automake时,它会检查目录下是否存在标准GNU软件包中应具备的各种文件,例如AUTHORS、ChangeLog、NEWS等文件。我们将其设置成foreign时,automake会改用一般软件包的标准来检查。 

    bin_PROGRAMS 
    这个是指定我们所要产生的可执行文件的文件名。如果你要产生多个可执行文件,那么在各个名字间用空格隔开。

    helloworld_SOURCES 
    这个是指定产生“helloworld”时所需要的源代码。如果它用到了多个源文件,那么请使用空格符号将它们隔开。比如需要 helloworld.h,helloworld.c那么请写成helloworld_SOURCES= helloworld.h helloworld.c。 

    如果你在bin_PROGRAMS定义了多个可执行文件,则对应每个可执行文件都要定义相对的filename_SOURCES。

    6、 automake 
    我们使用automake --add-missing来产生Makefile.in。 

    选项--add-missing的定义是“add missing standard files to package”,它会让automake加入一个标准的软件包所必须的一些文件。 

    我们用automake产生出来的Makefile.in文件是符合GNU Makefile惯例的,接下来我们只要执行configure这个shell 脚本就可以产生合适的 Makefile 文件了。 

    7、 Makefile 
    在符合GNU Makefiel惯例的Makefile中,包含了一些基本的预先定义的操作: 

    make 
    根据Makefile编译源代码,连接,生成目标文件,可执行文件。 

    make clean 
    清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。 

    make install 
    将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。 

    make dist 
    产生发布软件包文件(即distribution package)。这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。 

    它会在当前目录下生成一个名字类似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.in中定义的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。 

    make distcheck 
    生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了。 

    =============================================== 
    helloworld-1.0.tar.gz is ready for distribution 
    =============================================== 
    make distclean 

    类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile。 

    五、结束语 
    通过上面的介绍,你应该可以很容易地生成一个你自己的符合GNU惯例的Makefile文件及对应的项目文件。 
    如果你想写出更复杂的且符合惯例的Makefile,你可以参考一些开放代码的项目中的configure.in和Makefile.am文件,比如:嵌入式数据库sqlite,单元测试cppunit。

     

     

    展开全文
  • Qt configure参数解释

    2012-12-20 15:54:02
    QT configure参数解释 编译Qt源码必备的教程
  • 【CMake】CMake的configure_file指令

    千次阅读 2020-01-06 21:13:11
    configure_file,复制一份输入文件到输出文件,替换输入文件中被@VAR@或者${VAR}引用的变量值。也就是说,让普通文件,也能使用CMake中的变量 。例如: 比如在CMakeLists.txt中定义了如下的变量: set(BUILD_...

    有些时候,我们需要在项目中标明版本号、Git的hash号、编译时间等信息,但是显然,对于Git的hash号、编译时间我们不想自己手动填写。现在提供一种途径,将这些信息写入到头文件中,再编译到so库文件或者可执行程序中。

    这样,就可以通过提供库文件的接口或者可执行程序的打印中得到这些值了。

    本文实例源码github地址https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q1/20200106


    configure_file

    configure_file(<input> <output>
                   [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
                   [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
    

    官方CMake教程对它的解释是:将文件复制到另一个位置并修改其内容。

    当然,这里的修改其内容也不是任意地修改,也是遵循一定的规则:将input文件复制到output文件,并在输入文件内容中的变量,替换引用为@VAR@或${VAR}的变量值。每个变量引用将替换为该变量的当前值,如果未定义该变量,则为空字符串

    可能有些绕头,再浅显一点:configure_file,复制一份输入文件到输出文件,替换输入文件中被@VAR@或者${VAR}引用的变量值。也就是说,让普通文件,也能使用CMake中的变量。例如:

    比如在CMakeLists.txt中定义了如下的变量:

    set(BUILD_Version 1)
    

    输入文件中为:

    #define BUILD_Version @BUILD_Version@
    

    那么,在输出文件中就会被转化为:

    #define BUILD_Version 1
    

    顺便,看一下configure_file的其他选项:

    • COPYONLY:只拷贝文件,不进行任何的变量替换。这个选项在指定了NEWLINE_STYLE选项时不能使用(无效)。
    • ESCAPE_QUOTES:躲过任何的反斜杠(C风格)转义。
    • @ONLY:限制变量替换,让其只替换被@VAR@引用的变量(那么${VAR}格式的变量将不会被替换)。这在配置${VAR}语法的脚本时是非常有用的。
    • NEWLINE_STYLE style:指定输出文件中的新行格式。UNIX和LF的新行是\n,DOS和WIN32和CRLF的新行格式是\r\n。这个选项在指定了COPYONLY选项时不能使用(无效)。

    通常情况下,输入文件以.h.in为后缀,输出文件以.h为后缀


    实例

    实例内容:在CMakeLists.txt中指定版本号、自动获取Git的分支和hash号、自动获取编译时间,并将这些信息写入到可执行程序中打印出来。

    前提

    需要读懂下面的程序内容,需要掌握知识点:

    程序内容

    编写utils.cmake,定义macro宏,用于获取Git的hash值和分支:

    # get git hash
    macro(get_git_hash _git_hash)   # 宏的开始
        find_package(Git QUIET)     # 查找Git,QUIET静默方式不报错
        if(GIT_FOUND)
          execute_process(          # 执行一个子进程
            COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%h # 命令
            OUTPUT_VARIABLE ${_git_hash}        # 输出字符串存入变量
            OUTPUT_STRIP_TRAILING_WHITESPACE    # 删除字符串尾的换行符
            ERROR_QUIET                         # 对执行错误静默
            WORKING_DIRECTORY                   # 执行路径
              ${CMAKE_CURRENT_SOURCE_DIR}
            )
        endif()
    endmacro()                      # 宏的结束
    
    # get git branch
    macro(get_git_branch _git_branch)   # 宏的开始
        find_package(Git QUIET)     # 查找Git,QUIET静默方式不报错
        if(GIT_FOUND)
          execute_process(          # 执行一个子进程
            COMMAND ${GIT_EXECUTABLE} symbolic-ref --short -q HEAD
            OUTPUT_VARIABLE ${_git_branch}        # 输出字符串存入变量
            OUTPUT_STRIP_TRAILING_WHITESPACE    # 删除字符串尾的换行符
            ERROR_QUIET                         # 对执行错误静默
            WORKING_DIRECTORY                   # 执行路径
              ${CMAKE_CURRENT_SOURCE_DIR}
            )
        endif()
    endmacro()                      # 宏的结束
    

    编写CMakeLists.txt,定义编译时间戳变量、版本变量、Git信息变量,同时实现编译可执行程序、复制文件和变换变量:

    cmake_minimum_required(VERSION 3.0)
    include(cmake/utils.cmake)
    project(main)
    
    string(TIMESTAMP BUILD_TIMESTAMP "%Y-%m-%d %H:%M:%S")
    message("Build timestamp is ${BUILD_TIMESTAMP}")
    
    set(VERSION_MAJOR 0)
    set(VERSION_MINOR 0)
    set(VERSION_PATCH 1)
    message("Version is ${VERSION_MAJOR} ${VERSION_MINOR} ${VERSION_PATCH}")
    
    set(GIT_HASH "")
    get_git_hash(GIT_HASH)
    message("Git hash is ${GIT_HASH}")
    
    set(GIT_BRANCH "")
    get_git_branch(GIT_BRANCH)
    message("Git branch is ${GIT_BRANCH}")
    
    configure_file (
        "${PROJECT_SOURCE_DIR}/include/utils.h.in"
        "${PROJECT_SOURCE_DIR}/include/utils.h"
    )
    
    add_executable(${PROJECT_NAME} src/main.cc)
    
    include_directories(
        ${PROJECT_SOURCE_DIR}/include
    )
    
    install(TARGETS ${PROJECT_NAME}
        RUNTIME DESTINATION ${PROJECT_SOURCE_DIR})
    

    configure_file的输入文件:

    #ifndef UTILS_H_IN
    #define UTILS_H_IN
    
    #define VERSION_MAJOR @VERSION_MAJOR@
    #define VERSION_MINOR @VERSION_MINOR@
    #define VERSION_PATCH @VERSION_PATCH@
    
    #define BUILD_TIMESTAMP "@BUILD_TIMESTAMP@"
    
    #define GIT_BRANCH "@GIT_BRANCH@"
    #define GIT_HASH "@GIT_HASH@"
    
    #endif // UTILS_H_IN
    

    主程序为:

    #include "utils.h"
    #include <iostream>
    
    int main(int argc, char const *argv[])
    {
      std::cout << "version is " << VERSION_MAJOR << ", " << VERSION_MINOR << ", "<< VERSION_PATCH << std::endl;
      std::cout << "timestamp is " << BUILD_TIMESTAMP << std::endl;
      std::cout << "git is " << GIT_BRANCH << ", " << GIT_HASH << std::endl;
      
      return 0;
    }
    

    编译运行

    编译并运行该项目,会生成新的文件:

    #ifndef UTILS_H_IN
    #define UTILS_H_IN
    
    #define VERSION_MAJOR 0
    #define VERSION_MINOR 0
    #define VERSION_PATCH 1
    
    #define BUILD_TIMESTAMP "2019-12-27 20:28:57"
    
    #define GIT_BRANCH "master"
    #define GIT_HASH "14e77d2"
    
    #endif // UTILS_H_IN
    

    运行结果为:

    yngzmiao@yngzmiao-virtual-machine:~/test/test$ ./main 
    version is 0, 0, 1
    timestamp is 2019-12-27 21:28:57
    git is master, 14e77d2
    

    相关阅读

    展开全文
  • linux安装配置CONFIGURE详解

    千次阅读 2019-05-27 19:21:55
     1、configure,这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如 代码:   ./configure --prefix=/usr  上面的意思是将该软件安装在 /usr ...

    tar.gz、tar.bz2的是源代码包,需要编译之后才能安装,在编译过程中你可以指定各种参数以适应你的系统需求,比如安装位置,优化参数,要哪些功能不要哪些功能等等。
    这类源代码包需要解压后(tar.gz的用 tar zxvf 解压,tar.bz2的用 tar jxvf 解压),进入解压目录,一般都有一个 INSTALL 的文本文件,里面一般都是安装的详细说明,可以用vi、nano、pico或X下面的文本编辑器(如gedit,gvim,kedit等)打开查看,安装一般就是三个步骤:

        1、configure,这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如
    代码:
     
    ./configure --prefix=/usr

        上面的意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的/usr/local/share)。同时一些软件的配置文件你可以通过指定 --sys-config= 参数进行设定。有一些软件还可以加上 --with、--enable、--without、--disable 等等参数对编译加以控制,你可以通过允许 ./configure --help 察看详细的说明帮助。

        2、make ,这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或python编写的软件需要调用perl或python来进行编译)。如果在 make 过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。

        3、make install,这条命令来进行安装(当然有些软件需要先运行 make check 或 make test 来进行一些测试),这一步一般需要你有 root 权限(因为要向系统写入文件)。

        安装完毕后你就可以删除解压目录了。采用源代码编译方式来安装软件是 Linux 系统下最常见的安装软件方法,而且这种方法使你可以更加自由地控制安装细节,所以提倡大家多使用该方法安装软件。


    转自:http://blog.chinaunix.net/uid-24704319-id-2594460.html

    本文教你如何使用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)。整体架构如下:
    |-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, 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.am

            AUTOMAKE_OPTIONS = foreign  
            SUBDIRS = src   


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

    src/Makefile.am

    第一行作用同前。
    第二行是目标执行档的名称。
    第三行是生成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所带的两个参数!现在你可以试试把它解压安装了。
    附上操作命令:

    [cpp] view plain copy
    在CODE上查看代码片派生到我的代码片

        aclocal  
        autoheader  
        automake  
        automake -a 和 automake -a src/Makefile  
        autoconf  

    [cpp] view plain copy
    在CODE上查看代码片派生到我的代码片

        ./configure  
        make   
        src/tt  
        ./configure --help  
          
        ./configure --enable-popo  
        make   
        src/tt  
        make distcheck  

    源码下载:

     


    ---------------------
    作者:mozun1
    来源:CSDN
    原文:https://blog.csdn.net/mozun1/article/details/62237045
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • ndk编译ffmpeg修改后的configure文件ndk编译ffmpeg修改后的configure文件ndk编译ffmpeg修改后的configure文件ndk编译ffmpeg修改后的configure文件
  • ./configure 的配置和用法

    千次阅读 2019-08-22 14:17:34
    Linux环境下的软件安装,并不是...Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。 ‘configure’脚本有大量的命令行选项。对不同的软件包来说,这些选项可能会有变化,但是许多基本的选项是不...
  • Configure Virtual Serial Port Driver破解版

    热门讨论 2012-10-25 13:52:40
    Configure Virtual Serial Port Driver,能在PC上模拟两个虚拟串口,一个发送一个接受,可以看自己串口发送的内容。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 768,415
精华内容 307,366
关键字:

configure