./configure 命令详解

configure脚本选项解析
本文详细介绍了'configure'脚本的常用选项及其功能,包括如何指定安装路径、配置依赖项等,有助于用户根据需求定制软件安装。

转载:http://blog.chinaunix.net/uid-21139058-id-446661.html


'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库的目录的方法.
<think>我们讨论在Dockerfile中使用`./configure`命令的场景。`./configure`是Unix-like系统中源代码安装的典型配置步骤,用于检查系统环境、生成Makefile等。在Dockerfile中,我们通常需要从源代码编译安装软件,因此会使用到`./configure`。 ### 一、Dockerfile中使用`./configure`的基本方法 在Dockerfile中,我们通常在`RUN`指令中执行`./configure`,并伴随一些参数。基本步骤为: 1. 获取源代码(通过`ADD`或`COPY`,或直接下载) 2. 进入源代码目录 3. 运行`./configure`并指定参数(如安装路径、启用/禁用功能等) 4. 执行`make`和`make install` **示例Dockerfile片段**(以安装ffmpeg为例): ```dockerfile FROM ubuntu:20.04 # 安装编译依赖 RUN apt-get update && apt-get install -y \ build-essential \ nasm \ yasm \ libfreetype6-dev \ libx264-dev \ libfontconfig-dev \ libharfbuzz-dev \ libmp3lame-dev \ pkg-config \ libssl-dev \ wget # 下载ffmpeg源码 RUN wget https://ffmpeg.org/releases/ffmpeg-7.1.1.tar.gz && \ tar -xzf ffmpeg-7.1.1.tar.gz && \ rm ffmpeg-7.1.1.tar.gz # 编译安装 WORKDIR /ffmpeg-7.1.1 RUN ./configure --prefix=/usr/local/ffmpeg \ --enable-libfreetype \ --enable-libx264 \ --enable-libfontconfig \ --enable-libharfbuzz \ --enable-gpl \ --enable-version3 \ --enable-nonfree \ --enable-shared \ --enable-filter=drawtext \ --enable-libmp3lame \ --enable-openssl && \ make -j$(nproc) && \ make install # 设置环境变量 ENV PATH=/usr/local/ffmpeg/bin:$PATH ``` ### 二、常见问题及解决方法 #### 1. 依赖缺失导致`./configure`失败 **表现**:配置过程中出现类似`error: Package requirements (xxx) were not met`的错误。 **解决**:在运行`./configure`前安装所有依赖库的开发包。例如,对于`libx264`,需要安装`libx264-dev`(Ubuntu)或`x264-devel`(CentOS)。 #### 2. 权限问题 **表现**:`make install`时因权限不足而失败。 **解决**:确保安装目录存在且具有写入权限。如果安装到系统目录(如`/usr/local`),通常需要以root用户运行(Dockerfile默认以root运行,所以一般不需要额外处理)。 #### 3. 路径问题 **表现**:`./configure`找不到头文件或库文件。 **解决**:使用`--extra-cflags`和`--extra-ldflags`指定路径,例如: ```dockerfile RUN ./configure ... \ --extra-cflags="-I/usr/local/include" \ --extra-ldflags="-L/usr/local/lib" ``` #### 4. 多阶段构建减小镜像体积 **问题**:编译环境会使得镜像体积庞大。 **解决**:使用多阶段构建,将编译产物复制到新镜像中。 ```dockerfile # 第一阶段:编译 FROM ubuntu:20.04 AS build # ... 安装依赖和编译ffmpeg # 第二阶段:运行 FROM ubuntu:20.04 COPY --from=build /usr/local/ffmpeg /usr/local/ffmpeg ENV PATH=/usr/local/ffmpeg/bin:$PATH ``` #### 5. 缓存导致依赖更新不及时 **表现**:修改Dockerfile后重新构建,但`apt-get update`未执行。 **解决**:合并`apt-get update`和`apt-get install`到同一RUN指令,并确保`update`在`install`之前。 #### 6. 配置参数错误 **表现**:配置参数拼写错误或冲突。 **解决**:查阅软件文档,验证参数。注意参数之间的依赖关系(例如启用某些功能可能需要先启用其他功能)。 ### 三、进阶用法 1. **使用官方基础镜像**:如`python:3.8`、`php:7.4-apache`等,它们已经包含常用工具和库,可减少依赖安装步骤[^4]。 2. **清理中间文件**:在同一个RUN指令中删除源码和临时文件,减小镜像层大小。 ```dockerfile RUN ./configure ... && make && make install && \ rm -rf /ffmpeg-7.1.1* ``` 3. **使用更小的基础镜像**:如Alpine Linux,但需注意Alpine使用musl libc,可能导致兼容性问题。 ### 四、相关实践案例 在引用[5]中,展示了在CentOS镜像中编译安装Nginx的Dockerfile片段: ```dockerfile WORKDIR /usr/local/src/nginx-1.9.3 RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-pcre=/usr/local/src/pcre-8.37 && make install ``` 这里指定了用户、组以及模块,并使用`--with-pcre`指定了PCRE库的源码路径[^5]。 ### 五、总结 在Dockerfile中使用`./configure`时,关键点包括: - 确保所有依赖库已安装 - 正确设置配置参数 - 处理路径和权限问题 - 优化镜像大小(多阶段构建、清理) 通过以上方法,可以高效地在Docker中完成源代码配置和编译。 ### 相关问题 1. 如何解决Docker构建过程中遇到的`configure: error: no acceptable C compiler found`错误? 2. 在Dockerfile中编译安装软件时如何优化构建速度? 3. 如何验证Docker容器内通过源代码安装的软件功能是否正常? 4. 使用Alpine Linux作为基础镜像编译软件时需要注意哪些问题? 5. 在多阶段构建中如何只复制所需的运行文件? 引用: [^1]: Docker使用指南(五)—— Dockerfile详解。 [^4]: dockerfile---docker-php-source/docker-php-ext-install/docker-php-enable/docker-configure解释。 [^5]: docker-dockerfile使用。 </think>### Dockerfile中使用`./configure`的全面指南 在Dockerfile中使用`./configure`命令是源码编译安装软件的关键步骤,主要用于生成适用于当前环境的Makefile文件。以下是详细使用方法、常见问题及解决方案: --- ### 一、基本使用方法 ```dockerfile FROM ubuntu:22.04 # 1. 安装基础编译工具 RUN apt-get update && apt-get install -y \ build-essential \ autoconf \ automake \ libtool \ pkg-config # 2. 安装特定依赖库(以FFmpeg为例) RUN apt-get install -y \ libfreetype-dev \ libx264-dev \ libssl-dev # 3. 获取源码(推荐使用官方发布包) WORKDIR /build ADD http://ffmpeg.org/releases/ffmpeg-7.1.1.tar.gz /build/ RUN tar -xzf ffmpeg-7.1.1.tar.gz # 4. 运行configure(关键步骤) WORKDIR /build/ffmpeg-7.1.1 RUN ./configure \ --prefix=/usr/local \ --enable-shared \ --enable-libx264 \ --enable-openssl # 5. 编译和安装 RUN make -j$(nproc) && make install ``` --- ### 二、最佳实践 1. **依赖管理**: - 使用`&&`连接命令避免创建过多镜像层 - 清理缓存减小镜像体积: ```dockerfile RUN apt-get update && apt-get install -y ... \ && rm -rf /var/lib/apt/lists/* ``` 2. **多阶段构建**(减小镜像大小): ```dockerfile # 构建阶段 FROM ubuntu:22.04 AS builder RUN ... ./configure ... make install # 运行阶段 FROM ubuntu:22.04 COPY --from=builder /usr/local /usr/local ``` 3. **参数优化**: ```dockerfile RUN ./configure \ --disable-static \ # 禁用静态库 --enable-optimizations \ # 启用优化 CFLAGS="-O3" \ # 优化级别 LDFLAGS="-Wl,-rpath=/usr/local/lib" # 运行时库路径 ``` --- ### 三、常见问题及解决方案 #### 问题1:依赖缺失错误 **错误提示**: ```log configure: error: Package requirements (libx264) were not met ``` **解决方案**: ```dockerfile # 安装开发包(带-dev/-devel后缀) RUN apt-get install -y libx264-dev ``` #### 问题2:头文件路径错误 **错误提示**: ```log fatal error: openssl/ssl.h: No such file or directory ``` **解决方案**: ```dockerfile # 指定头文件和库路径 RUN ./configure \ --extra-cflags="-I/usr/include/openssl" \ --extra-ldflags="-L/usr/lib/x86_64-linux-gnu" ``` #### 问题3:权限问题 **错误提示**: ```log /bin/sh: ./configure: Permission denied ``` **解决方案**: ```dockerfile # 添加执行权限 RUN chmod +x configure && ./configure ... ``` #### 问题4:架构不兼容 **错误提示**: ```log configure: error: assembler too old, install yasm or nasm ``` **解决方案**: ```dockerfile # 安装新版本汇编器 RUN apt-get install -y nasm ``` --- ### 四、高级技巧 1. **交叉编译支持**: ```dockerfile RUN ./configure \ --host=aarch64-linux-gnu \ # 目标平台 --build=x86_64-linux-gnu # 构建平台 ``` 2. **环境变量覆盖**: ```dockerfile ENV CXXFLAGS="-O2 -fPIC" RUN ./configure # 自动继承环境变量 ``` 3. **配置缓存加速**: ```dockerfile RUN [ -f config.cache ] || ./configure ... \ && make -j$(nproc) ``` --- ### 五、典型应用场景 1. **自定义编译参数**(如启用特定模块) 2. **安全加固**(禁用危险特性) 3. **精简安装**(移除不需要的组件) 4. **跨平台构建**(ARM/x86兼容) > 参考示例:在构建nginx时指定PCRE路径[^5]: > ```dockerfile > RUN ./configure --with-pcre=/usr/local/src/pcre-8.37 > ``` --- ### 相关问题 1. 如何在Docker多阶段构建中优化`./configure`的使用? 2. 如何解决`./configure`产生的"undefined reference"链接错误? 3. 在Alpine Linux中使用`./configure`有哪些特殊注意事项? 4. 如何验证Dockerfile中`./configure`生成的配置是否符合预期? 5. 在Kubernetes环境中如何管理自定义编译的Docker镜像?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值