./configure 参数详解

Linux Configure详解
本文详细介绍了Linux环境下使用Configure脚本进行软件包配置的各种选项及其用途,包括如何指定安装路径、依赖库位置等,对于理解并正确配置软件包具有重要的指导意义。

专贴地址:http://hi.baidu.com/kepa520/blog/item/cf8174b31f8857acd8335ae3.html

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

<think>我们正在讨论的是Linux环境下通过源代码安装软件时使用的`./configure`脚本。这个脚本用于检测系统环境并生成适合当前系统的Makefile。用户要求了解所有可用的参数及其详细说明。虽然不可能列出所有软件包的所有参数(因为每个项目的configure参数可能不同),但我们可以涵盖大多数常见参数和通用模式。 根据引用[1][2][3]的内容,结合标准autoconf文档,以下是常见的`./configure`参数分类详解: --- ### 一、安装路径控制 | 参数 | 说明 | |-----------------------|----------------------------------------------------------------------| | `--prefix=PREFIX` | 设置软件安装的根目录,默认为`/usr/local` | | `--exec-prefix=EPREFIX` | 设置二进制程序安装目录,通常继承`--prefix` | | `--bindir=DIR` | 设置可执行程序目录,默认`PREFIX/bin` | | `--sbindir=DIR` | 设置系统管理员可执行程序目录,默认`PREFIX/sbin` | | `--libexecdir=DIR` | 设置内部库程序目录,默认`PREFIX/libexec` | | `--libdir=DIR` | 设置库文件目录,默认`PREFIX/lib` | | `--includedir=DIR` | 设置C头文件目录,默认`PREFIX/include` | | `--datadir=DIR` | 设置通用数据文件目录,默认`PREFIX/share` | | `--mandir=DIR` | 设置man手册目录,默认`PREFIX/share/man`(引用[2]提到) | | `--infodir=DIR` | 设置info文档目录,默认`PREFIX/share/info` | | `--localstatedir=DIR` | 设置可变状态数据目录(如日志),默认`PREFIX/var` | | `--sysconfdir=DIR` | 设置只读配置文件目录,默认`PREFIX/etc` | > 示例:`./configure --prefix=/opt/myapp --sysconfdir=/etc/myapp` --- ### 二、系统平台指定 | 参数 | 说明 | |-----------------------|----------------------------------------------------------------------| | `--build=BUILD` | 指定编译软件的系统平台(如`x86_64-pc-linux-gnu`),默认自动检测 | | `--host=HOST` | 指定软件运行的系统平台,交叉编译时使用(如`arm-linux-gnueabihf`) | | `--target=TARGET` | 指定软件面向的系统平台,主要用于工具链(如编译器的目标架构) | > 示例:`./configure --host=mipsel-linux-gnu`(引用[1][2]提到) --- ### 三、程序名称变换 用于多版本共存场景(引用[2]详细说明): | 参数 | 说明 | |-------------------------------|----------------------------------------------------------------------| | `--program-prefix=PREFIX` | 为安装的程序名添加前缀(如`--program-prefix=g`使`tar`变成`gtar`) | | `--program-suffix=SUFFIX` | 为安装的程序名添加后缀(如`--program-suffix=2.1`) | | `--program-transform-name=PROG` | 使用sed脚本重命名程序(如`s,x,x-,`将所有程序名后加横杠) | --- ### 四、特性开关控制 #### 1. 禁用特性(默认开启) ```bash --disable-FEATURE # 如--disable-nls(禁用国际化) ``` #### 2. 启用特性(默认关闭) ```bash --enable-FEATURE[=ARG] # 如--enable-shared[=yes/no] ``` > 示例:`--enable-buffers=128`(引用[2]提到) --- ### 五、依赖库与头文件控制 | 参数 | 说明 | |-------------------------------|----------------------------------------------------------------------| | `--with-PACKAGE[=ARG]` | 启用外部依赖包(如`--with-zlib=/opt/zlib`) | | `--without-PACKAGE` | 禁用外部依赖包(如`--without-python`) | | `--with-includes=DIRS` | 指定额外头文件搜索路径(多个路径用冒号分隔)(引用[3]提到) | | `--with-libraries=DIRS` | 指定额外库文件搜索路径(多个路径用冒号分隔) | > 示例:`--with-includes="/opt/tcl/include:/opt/perl5/include"`(引用[3]提到) --- ### 六、编译器与链接器控制 | 参数 | 说明 | |-----------------------|----------------------------------------------------------------------| | `CC=C_COMPILER` | 指定C编译器(如`CC=clang`) | | `CFLAGS="FLAGS"` | 设置C编译标志(如`CFLAGS="-O2 -march=native"`) | | `CPPFLAGS="FLAGS"` | 设置C预处理器标志(如头文件路径`-I/opt/include`) | | `LDFLAGS="FLAGS"` | 设置链接器标志(如库路径`-L/opt/lib`) | | `LIBS="LIBRARIES"` | 设置要链接的库(如`LIBS="-lm -lpthread"`) | > 注意:这些通常作为环境变量传递而非`./configure`参数,但也可直接使用: > `./configure CC=gcc CFLAGS="-O2"` --- ### 七、其他通用参数 | 参数 | 说明 | |-----------------------|----------------------------------------------------------------------| | `--srcdir=DIR` | 指定源码目录(当不在源码目录运行时使用) | | `--quiet` / `--silent` | 减少配置过程输出 | | `--version` | 显示autoconf版本 | | `--help` | 显示帮助信息(通常包含项目特定参数) | --- ### 八、实际应用案例 #### 交叉编译场景 ```bash ./configure \ --host=mipsel-linux \ --prefix=/opt/mipsel-app \ --with-zlib=/cross/mipsel/zlib \ CC="mipsel-linux-gcc" \ CFLAGS="-O2 -march=mips32" ``` #### 多版本共存场景 ```bash ./configure \ --prefix=/usr/local/python3.11 \ --program-suffix=3.11 \ --enable-optimizations ``` --- ### 注意事项 1. **参数差异**:不同软件的`configure`脚本可能支持不同参数,使用`./configure --help`查看具体选项 2. **环境变量优先级**:直接传递参数(如`CFLAGS="..."`)会覆盖环境变量设置 3. **缓存机制**:使用`config.cache`可加速重复配置(通过`-C`或`--config-cache`) > 数学表达:配置过程可视为函数 $f: (\text{params}, \text{env}) \rightarrow \text{Makefile}$,其中参数和环境变量共同决定输出。 --- §§相关问题§§ 1. 如何为特定架构(如ARM)交叉编译软件? 2. `./configure` 与 `cmake` 在构建系统上有何区别? 3. 如何解决 `configure` 脚本执行时的依赖缺失错误? 4. 在容器化构建环境中如何优化 `./configure` 参数?</think>### `./configure` 命令参数详解 `./configure` 是 Linux 源码编译安装的核心配置工具,用于检测系统环境、设置编译选项和生成 Makefile。以下是常用参数分类详解(基于 autoconf 通用规范和引用内容): --- #### **一、安装路径控制** | 参数 | 说明 | 示例 | |------|------|------| | `--prefix=PREFIX` | 设置软件安装根目录 | `--prefix=/usr/local` | | `--exec-prefix=EPREFIX` | 设置二进制程序安装目录 | `--exec-prefix=/opt` | | `--bindir=DIR` | 可执行程序目录 | `--bindir=/usr/bin` | | `--sbindir=DIR` | 系统管理员程序目录 | `--sbindir=/usr/sbin` | | `--libdir=DIR` | 库文件目录 | `--libdir=/usr/lib64` | | `--includedir=DIR` | C头文件目录 | `--includedir=/usr/include` | | `--datarootdir=DIR` | 只读数据根目录 | `--datarootdir=/usr/share` | | `--mandir=DIR` | man手册目录 | `--mandir=/usr/share/man` [^2] | | `--sysconfdir=DIR` | 配置文件目录 | `--sysconfdir=/etc` | --- #### **二、系统平台指定** | 参数 | 说明 | 数学表达 | |------|------|----------| | `--build=BUILD` | 指定编译平台 | $ \text{build\_arch} \neq \text{host\_arch} $ | | `--host=HOST` | 指定运行平台 | $ \text{host} = \text{mipsel-linux} $ | | `--target=TARGET` | 指定目标平台(编译器用) | $ \text{target} = \text{arm-linux-gnueabihf} $ [^2] | > 示例交叉编译: > `./configure --host=mipsel-linux --build=x86_64-linux-gnu` --- #### **三、特性开关控制** | 参数 | 说明 | 逻辑关系 | |------|------|----------| | `--enable-FEATURE[=ARG]` | 启用特性 | $ \text{enable} = \begin{cases} 1 & \text{if ARG=yes} \\ 0 & \text{if ARG=no} \end{cases} $ | | `--disable-FEATURE` | 禁用特性 | $ \text{disable} = 1 - \text{enable} $ [^2] | **常用特性:** ```bash --enable-shared # 构建动态库 --enable-static # 构建静态库 --enable-debug # 启用调试模式 --disable-nls # 禁用国际化支持 --enable-buffers=128 # 带参数的启用 [^2] ``` --- #### **四、依赖库控制** | 参数 | 说明 | 示例 | |------|------|------| | `--with-PACKAGE[=ARG]` | 启用外部依赖包 | `--with-openssl` | | `--without-PACKAGE` | 禁用外部依赖包 | `--without-python` | | `--with-includes=DIRS` | 指定头文件搜索路径 | `--with-includes="/opt/include:/usr/local/include"` [^3] | | `--with-libraries=DIRS` | 指定库文件搜索路径 | `--with-libraries="/opt/lib"` [^3] | --- #### **五、程序名称控制** | 参数 | 说明 | 示例 | |------|------|------| | `--program-prefix=PREFIX` | 程序名前缀 | `--program-prefix=g` → `gtar` [^2] | | `--program-suffix=SUFFIX` | 程序名后缀 | `--program-suffix=-dev` → `tar-dev` | | `--program-transform-name=PROG` | sed 脚本重命名 | `--program-transform-name='s/^/mips-/'` | --- #### **六、源码与缓存控制** | 参数 | 说明 | 示例 | |------|------|------| | `--srcdir=DIR` | 指定源码目录 | `--srcdir=../src` [^2] | | `--cache-file=FILE` | 指定缓存文件 | `--cache-file=config.cache` | | `--config-cache` / `-C` | 使用缓存加速配置 | `./configure -C` | --- #### **七、调试与帮助** | 参数 | 说明 | |------|------| | `--help` | 显示帮助信息(含项目特定参数) | | `--version` | 显示 autoconf 版本 | | `--no-create` | 仅检查环境不生成文件 | | `--quiet` / `--silent` | 减少输出信息 | --- ### **典型配置示例** ```bash # 交叉编译示例 ./configure \ --host=mipsel-linux \ --prefix=/opt/mips-app \ --with-zlib=/cross/mipsel/zlib \ --disable-gui \ --enable-optimize \ CFLAGS="-O2 -march=mips32" ``` > **路径搜索原理**: > 头文件搜索路径满足: > $$ \text{include\_path} = \left\{ \text{/usr/include}, \text{/opt/include}, \dots \right\} \cup \text{--with-includes} $$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值