configure 完整使用手册(零基础·全覆盖·可直接查阅)

configure 完整使用手册(零基础·全覆盖·可直接查阅)

目录

  1. 基础认知与编译标准流程

  2. configure 脚本执行语法与配套辅助命令

  3. 五大核心编译环境变量(区分编译 / 预处理 / 链接)

  4. -Wl 链接器参数详解(含 rpath 核心用法)

  5. configure 后置通用配置参数(-- 开头)

  6. 静态编译、32/64 位、交叉编译专项教程

  7. 外部独立编译(out-of-source)标准方案

  8. pkg-config 简化编译参数写法

  9. 系统依赖安装区分(CentOS / Ubuntu)

  10. 无 Root 权限编译部署方案

  11. 完整生产通用模板

  12. 配套验证、排查命令清单

  13. 补充进阶知识点与生产最佳实践


1. 基础认知与编译标准流程

1.1 什么是 configure

开源源码包自带的自动配置 Shell 脚本,由 GNU Autotools 工具生成,三大核心作用:

  1. 自动检测系统编译器、头文件、依赖库、CPU 架构,缺失依赖直接终止并提示;

  2. 根据传入参数自动生成Makefile编译规则文件;

  3. 自定义安装路径、开关功能模块、指定第三方库、调整编译/链接安全参数。

1.2 源码编译三步固定流程

# 步骤1:配置环境,生成Makefile./configure[前置环境变量][后置 -- 参数]# 步骤2:多核编译源码make-j$(nproc)# 步骤3:安装程序、库、配置文件(多数路径需要root)makeinstall

2. configure 脚本执行语法与配套辅助命令

2.1 硬性执行规则

  1. 必须写./configure./代表当前目录,省略会去系统 PATH 查找,无匹配命令直接报错;

  2. 参数顺序不可颠倒:环境变量写在前,configure --参数写在后

# 标准格式变量1=值 变量2=值 ./configure --参数1 --参数2
  1. 查看软件全部支持参数
./configure--help# 完整帮助./configure-h# 精简帮助

2.2 清理、复用、测试配套命令

# 轻度清理:仅删除缓存、日志、Makefilerm-fconfig.cache config.log config.status Makefile# 深度彻底清理(修改参数/换依赖必执行),还原纯净源码makedistclean# 复用上次全部configure配置,无需重复粘贴长串参数./config.status# 仅删除编译生成的.o中间文件,保留Makefilemakeclean# 卸载源码编译安装的软件(部分软件支持)makeuninstall# 编译后执行官方单元测试,校验程序可用性makecheck

3. 五大核心编译环境变量

记忆口诀:CFLAGS 管 C 编译,CXXFLAGS 管 C++;CPPFLAGS 管头文件;LDFLAGS 管链接;LIBS 管依赖库列表

3.1 CFLAGS(C 语言编译参数,仅作用于 .c 文件)

禁止写入-L/-l/-Wl/rpath等链接参数

参数作用场景
-O0无优化,完整调试信息,开发调试默认
-O2生产标准优化,平衡性能体积,线上首选
-O3极致性能优化,程序体积增大
-Os压缩程序体积,嵌入式专用
-g生成 gdb 调试符号,用于崩溃堆栈排查
-Wall -Wextra开启全部代码警告,规范编码
-Werror所有警告直接判定为编译失败
-DNDEBUG关闭代码断言,生产环境必加,提升性能
-fPIE普通程序安全加固,配合 pie 开启 ASLR
-fPIC编译动态库.so 强制添加,否则报重定位错误
-m32/-m6464 位系统编译 32/64 位程序

示例:

CFLAGS="-O2 -Wall -fPIE -DNDEBUG"

3.2 CXXFLAGS(C++ 编译参数,仅作用 .cpp)

参数与 CFLAGS 完全一致,日常直接复用:

CXXFLAGS="$CFLAGS"

3.3 CPPFLAGS(预处理器参数)

仅两件事:指定头文件目录、自定义全局宏

  • -I/xxx/include:指定第三方头文件存放路径

  • -D宏名=数值:全局定义功能宏,开启软件内置特性
    示例:

CPPFLAGS="-I/usr/local/openssl/include -DENABLE_SSL=1"

3.4 LDFLAGS(链接阶段专用,所有-Wl参数放此处)

代码编译完成后,拼接程序与库文件阶段使用,核心包含库路径、rpath、安全加固。

  1. -L/xxx/lib:仅编译阶段生效,查找库文件

  2. -Wl,-rpath,路径:将库路径硬编码写入程序,运行自动加载 so,无需LD_LIBRARY_PATH

    • 固定服务器路径:-Wl,-rpath,/usr/local/openssl/lib

    • 便携打包相对路径:-Wl,-rpath,'$ORIGIN/../lib'

    • $ORIGIN= 程序所在目录;\$转义防止 Shell 提前解析

  3. 安全加固组合:-Wl,-z,relro,-z,now,-z,noexecstack,-pie,-Wl,--as-needed

  4. 静态动态切换:-Wl,-Bstatic优先静态库;-Wl,-Bdynamic恢复动态库

  5. 严格检测:-Wl,--no-undefined禁止未定义符号,提前暴露链接报错

示例:

LDFLAGS="-L/usr/local/openssl/lib -Wl,-rpath,/usr/local/openssl/lib,-z,relro,-z,now"

3.5 LIBS(依赖库列表)

专门存放-l库名,统一管理需要链接的第三方库,与 LDFLAGS 分离更清晰。

# 链接openssl加密、z压缩、系统线程库LIBS="-lcrypto -lssl -lz -lpthread"

3.6 工具链控制变量(切换编译器 / 交叉编译)

CC=gcc# 指定C编译器CXX=g++# 指定C++编译器AR=ar# 静态库打包工具RANLIB=ranlib# 静态库索引生成PKG_CONFIG_PATH=/xxx/lib/pkgconfig# 第三方库pc文件检索路径PATH=/opt/aarch64/bin:$PATH# 前置交叉编译器路径

切换 Clang 示例:

CC=clangCXX=clang++ ./configure--prefix=/opt/test

4. -Wl 链接器参数专项详解

-Wl,xxx作用:将逗号后的参数直接传递给 ld 链接器,全部写在LDFLAGS

  1. -Wl,-rpath,xxx:运行时库路径(核心,上文已说明)

  2. -Wl,-s:链接阶段剥离符号表,等效编译后strip,缩小程序体积

  3. -Wl,-Map,link.map:输出链接映射文件,排查符号冲突、依赖缺失

  4. -Wl,--export-dynamic:程序加载插件 dlopen 时导出内部符号

  5. -Wl,--disable-new-dtags:生成 DT_RPATH(优先级高于 LD_LIBRARY_PATH,不推荐)

  6. -Wl,--dynamic-linker=/lib/ld-linux-aarch64.so.1:自定义动态链接器,嵌入式交叉编译用

5. configure 后置通用配置参数(-- 开头)

5.1 安装路径类(核心--prefix

  • --prefix=/自定义目录:软件安装根目录,默认/usr/local

  • --sysconfdir=/etc/xxx:单独存放配置文件

  • --libdir=/xxx/lib--bindir=/xxx/bin--sbindir=/xxx/sbin:拆分库、普通命令、后台程序目录
    示例:

./configure--prefix=/usr/local/nginx--sysconfdir=/etc/nginx

5.2 动态 / 静态库编译开关

  • --enable-shared:编译 .so 动态库,默认开启

  • --disable-shared:关闭动态库,仅生成静态程序

  • --enable-static:编译 .a 静态库,默认关闭

5.3 通用功能开关(含 --disable-nls)

  1. --disable-nls
    NLS = Native Language Support,多语言翻译功能,依赖 gettext/libintl;关闭后程序仅输出英文,消除多语言依赖。
    适用场景:交叉编译、静态编译、最小化系统、无 gettext 开发包;反向参数--enable-nls默认开启。

  2. --enable-debug:开启完整调试符号,GDB 调试专用

  3. --disable-debug:关闭调试信息,程序更小更快

  4. --enable-threads:开启多线程支持

5.4 第三方依赖控制

  • --with-库名=/源码/安装目录:手动指定 OpenSSL/PCRE/zlib 等库路径

  • --without-库名:彻底禁用该依赖,不编译对应功能

5.5 交叉编译专用

  • --host=aarch64-linux-gnu:程序最终运行设备架构

  • --build=x86_64-linux-gnu:本机编译架构,自动检测无需手动填写

  • --target=xxx:仅编译编译器、GDB 工具链使用

5.6 隐藏高级控制参数

  • --no-create:仅检测环境,不生成任何 Makefile,校验依赖是否齐全

  • --cache-file=arm.cache:自定义缓存文件,多架构编译隔离缓存

  • --srcdir=../:外部独立编译指定源码目录

  • --quiet` / `-q:静默输出,仅打印报错

  • --verbose` / `-V:完整打印检测流程,排错专用

6. 专项编译方案

6.1 全静态编译

静态程序无需外部 so 库,可任意迁移;必须加--disable-nls

CFLAGS="-O2 -static"LDFLAGS="-static -Wl,--as-needed"./configure --disable-shared --enable-static --disable-nls

注意:静态编译不需要 rpath;glibc 静态编译存在系统调用兼容问题,嵌入式谨慎使用。

6.2 64 位系统编译 32 位程序

前置安装 32 位开发库:
CentOS:yum install glibc-devel.i686 gcc-c++.i686
Ubuntu:apt install gcc-multilib g++-multilib
编译命令:

CFLAGS="-m32"CXXFLAGS="-m32"LDFLAGS="-m32"./configure--prefix=/opt/32bit

6.3 ARM/AArch64 交叉编译

PATH=/opt/aarch64/bin:$PATHCC=aarch64-linux-gnu-gccCXX=aarch64-linux-gnu-g++ ./configure--host=aarch64-linux-gnu--prefix=/opt/arm_app --disable-nls

7. 外部独立编译(out-of-source build,工程化推荐)

所有编译产物生成独立文件夹,不污染源码,切换配置直接删除build目录即可,无需distclean

# 1. 创建独立编译目录mkdirbuild&&cdbuild# 2. 执行上级目录configureCFLAGS="xxx"LDFLAGS="xxx"../configure--srcdir=../--prefix=/usr/local/xxx# 3. 编译安装make-j$(nproc)&&makeinstall

8. pkg-config 简化参数写法

无需手动书写大量-I / -L,自动提取第三方库编译链接参数。

CFLAGS="-O2$(pkg-config --cflags-only-I openssl)"LDFLAGS="$(pkg-config --libs-only-L openssl)-Wl,-rpath,$(pkg-config--variable=libdir openssl)"LIBS="$(pkg-config --libs-only-l openssl)"

9. 系统依赖包命名区分

configure 提示缺失库时,开发包命名规则不同:

  1. CentOS/RHEL/Rocky:库名 +-devel
    例:openssl-devel、pcre-devel、zlib-devel

  2. Ubuntu/Debian:lib + 库名 +-dev
    例:libssl-dev、libpcre3-dev、zlib1g-dev

10. 无 Root 权限编译部署

无法写入/usr/local等系统目录,两种方案:

  1. 指定家目录安装
./configure--prefix=$HOME/.local/myappmake&&makeinstall
  1. 临时加载环境变量运行
exportPATH=$HOME/.local/myapp/bin:$PATHexportLD_LIBRARY_PATH=$HOME/.local/myapp/lib

11. 通用生产完整模板(适配 99% 开源软件)

# 编译优化安全参数CFLAGS="-O2 -Wall -Wextra -fPIE -fstack-protector-strong -DNDEBUG"CXXFLAGS="$CFLAGS"# 第三方头文件CPPFLAGS="-I/usr/local/openssl/include"# 链接路径 + rpath + 全套安全加固LDFLAGS="-L/usr/local/openssl/lib -Wl,-rpath,/usr/local/openssl/lib,-z,relro,-z,now,-z,noexecstack,-pie,-Wl,--as-needed"# 依赖库列表LIBS="-lcrypto -lssl -lz -lpthread"# 整合执行配置CFLAGS="$CFLAGS"CXXFLAGS="$CXXFLAGS"CPPFLAGS="$CPPFLAGS"LDFLAGS="$LDFLAGS"LIBS="$LIBS"\./configure\--prefix=/usr/local/myapp\--disable-nls\--enable-shared\--enable-static

12. 高频踩坑与排错方案

  1. -Wl,-rpath写入 CFLAGS → 完全失效,必须放在 LDFLAGS

  2. 仅写-L不配置 rpath:编译成功,运行提示找不到共享库

  3. 交叉/静态编译不加--disable-nls:报 libintl 链接错误

  4. 修改参数/库路径不执行make distclean:缓存导致配置不更新

  5. 编译动态库缺少-fPIC:抛出重定位编译报错

  6. rpath 使用$ORIGIN不转义$:Shell 提前解析变量,路径失效

  7. 生产环境缺少-DNDEBUG:程序保留调试断言,性能损耗

  8. 动态库和可执行程序混用-fPIE/-fPIC:编译失败,动态库必须使用-fPIC

排错核心文件 config.log

终端报错仅展示简略信息,完整失败原因全部存在 config.log
检索关键词快速定位:

grep-ifailed config.log# 查找检测失败项grep-iheader config.log# 查找缺失头文件grep-ilibrary config.log# 查找缺失库

13. 配套验证排查命令清单

  1. 查看程序内置 RPATH 库路径
    readelf -d 程序文件名 | grep RPATH

  2. 查看软件全部支持配置项
    ./configure --help

  3. 查看链接映射文件(编译后)
    cat link.map

  4. 查看编译链接参数(二进制内保留)
    objdump -s -j .comment 程序名

14. 进阶知识点与生产最佳实践

14.1 易混淆概念区分

  1. DT_RPATH vs DT_RUNPATH
    默认生成 DT_RUNPATH,LD_LIBRARY_PATH 可临时覆盖库路径;DT_RPATH 优先级更高,环境变量无法覆盖,极少使用。

  2. -fPIEvs-fPIC
    -fPIE:普通可执行程序;-fPIC:仅动态库,不可混用。

  3. make cleanvsmake distclean
    clean:仅删除 .o 中间文件;distclean:删除 Makefile、缓存、日志,还原源码初始状态。

14.2 生产编译规范建议

  1. 线上程序统一使用-O2 -DNDEBUG,关闭调试符号与断言;

  2. 所有对外服务程序添加全套安全链接参数(relro/now/noexecstack/pie);

  3. 交付便携包统一使用$ORIGIN相对 rpath,不依赖服务器固定目录;

  4. 源码编译优先采用外部独立编译目录,避免污染源码;

  5. 交叉编译、全静态编译强制添加--disable-nls

  6. 升级软件流程:卸载旧版本 → 解压新版 → make distclean → 重新 configure 编译;

  7. 多架构编译使用独立 cache 缓存文件,避免检测冲突。