Tengine2.4.1 + OpenSSL1.1.1w 全平台编译踩坑手册(CentOS7 x86_64|Linux x64|ARM64|2026实战复盘)
文档说明
本文档为 2026.06.30 全天真实实战复盘
平台:CentOS 7.9 x86_64
编译目标:
- ✅ Linux x86_64 静态完整版(一次成功)
- ✅ Linux ARM64(aarch64) 静态完整版(大量踩坑后最终成功)
组件版本:
- Tengine:2.4.1(淘宝官方稳定版)
- OpenSSL:1.1.1w(高安全静态库)
用途:个人技术复盘、避坑手册、后续编译一键对照、面试/存档
第一章 整体编译架构原理(核心认知)
1.1 本机编译 vs 交叉编译
本机编译(x86_64 → x86_64)
宿主架构 = 目标架构,Tengine configure 检测完全正常,无任何BUG。
交叉编译(x86_64 → ARM64)
宿主 x86_64、目标 aarch64
Tengine 2.4.1 存在源码级架构探针硬BUG:
只要架构不一致,直接报错:
|----------------------------------------------------------------------------------------------------|
| checking for C compiler ... found but is not working C compiler aarch64-linux-gnu-gcc is not found |
这是本次最大、最核心、卡死一整天的BUG。
1.2 为什么不能直接 Linux 包改 Windows 包?
本次重要认知升级:
- Linux 编译产物:ELF 二进制,依赖 glibc、ld-linux
- Windows 需要:PE .exe 二进制,依赖 msvcrt、kernel32
二者ABI完全不互通,配置文件通用,程序本体绝对不能混用。
第二章 成功流程:X86_64 本机编译(无坑流程)
2.1 编译逻辑(最终稳定可用版)
-
独立预编译 OpenSSL 1.1.1w 静态库(no-shared -fPIC)
-
Tengine configure 不捆绑 zlib、不捆绑 pcre,规避大量递归编译BUG
-
精简无用模块,保留生产核心模块
-
make && make install
-
打包绿色目录、启停脚本
2.2 最终稳定 configure 参数(生产可用)
完全无坑、可长期复用:
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Plain Text ./configure \ --prefix=INSTALL \\ --with-cc-opt="-O2" \\ --with-openssl=SSL_BUILD \ --with-pcre-jit \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_gzip_static_module \ --without-http_ssi_module \ --without-http_userid_module \ --without-http_autoindex_module \ --without-http_split_clients_module \ --without-http_referer_module \ --without-http_geo_module \ --without-http_map_module \ --without-poll_module \ --without-select_module |
2.3 X64 编译结论
x86_64 本机编译非常稳定,无任何探针BUG,只要 OpenSSL 预编译即可一次成功。
第三章 全天踩坑:ARM64 交叉编译 全部报错复盘
3.1 报错1:--with-ld-opt 非法参数
报错信息
|---------------------------------------------------------------------------------|
| ./configure: error: the invalid value in --with-ld-opt="-static -lpthread -ldl" |
原因
Tengine2.4.1 的 configure 不支持 ld-opt 携带多参数,会直接判定非法。
解决方式
删除所有 --with-ld-opt 参数,改为 sed 后期注入 LDFLAGS
3.2 报错2:openssl ./config 找不到文件
报错信息
|------------------------------|
| /bin/sh: ./config: 没有那个文件或目录 |
原因(超级隐蔽BUG)
Tengine 检测到外部 OpenSSL 后,会强制拼接 /.openssl 隐藏目录
手动编译的 OpenSSL 没有这个目录,导致二次编译失败。
终极解决
|-------------------------------------------------|
| Plain Text ln -s SSL_BUILD SSL_BUILD/.openssl |
软链接欺骗探针,彻底根治。
3.3 报错3:交叉编译器 found but is not working(全天最大坑)
报错信息
|-----------------------------------------------------------------------------------------------------------|
| checking for C compiler ... found but is not working error: C compiler aarch64-linux-gnu-gcc is not found |
真实根因(全网99%人不知道)
Tengine2.4.1 自带架构探针:
如果 宿主机架构 != 目标架构
无论你怎么 export CC、怎么改环境变量,探针直接硬拒绝,判定编译器不可用。
最终唯一解决方案
-
先用默认 gcc 空配置跑完 configure(骗过架构检测)
-
生成 Makefile 后暴力全覆盖编译工具链
-
sed 强制替换 CC/AR/RANLIB 为 aarch64 工具链
-
手动写入 SSL 头文件与库路径
完全绕开 Tengine 智障探针。
3.4 报错4:make 没有规则可以创建 default/build
原因
configure 阶段报错退出,未生成合法 Makefile
解决
修复前面所有探针报错,保证 configure 成功生成 Makefile。
第四章 最终 ARM64 编译成功标准流程(可复用)
此流程为今日踩坑后沉淀的唯一稳定流程
4.1 前置
-
部署 aarch64-linux-gnu 交叉工具链
-
单独预编译 ARM64 OpenSSL1.1.1w 静态库
-
创建 .openssl 软链接
4.2 Tengine 核心绕坑步骤
-
不带任何编译链参数,先 configure 生成基础 Makefile
-
sed 强制替换全部编译工具为 aarch64
-
sed 手动写入 CFLAGS、LDFLAGS SSL 路径
-
make && make install
-
重命名 nginx → tengine
-
打包绿色包 + 启停脚本
第五章 关键技术总结(复习重点)
5.1 三大核心认知
- x86编译ARM,绝对不能在configure阶段指定交叉编译器,必死
- Tengine 2.4.1 不支持 ld-opt 多参数
- OpenSSL 必须单独预编译 + .openssl 软链接
5.2 跨平台绝对禁忌
Linux ELF 程序 不能 改成 Windows 程序
Windows 版本必须单独 MinGW 交叉编译 PE .exe
5.3 可复用资产
今日打磨出的 x64 + arm64 两套稳定编译参数
未来任何服务器、任何环境均可直接复用,零踩坑。
第六章 遗留待做(后续进阶)
- CentOS 交叉编译 纯正 Windows x64 .exe 绿色版
- 制作真正三平台合集:Linux-x64 / ARM64 / Windows-x64
- 全平台统一配置、统一启停规范
|(注:部分内容可能由 AI 生成)