摘要:本文详细解析了在 x86 Linux 主机上交叉编译 aarch64 (ARM64) 平台专用 curl 的完整配置脚本。通过 --host--build 参数指定交叉编译目标,使用 SYSROOT 定义目标平台根文件系统,并配置交叉编译工具链。通过 --without-xxx 禁用所有第三方依赖(如 SSL、zlib),以及 --disable-xxx 关闭非 HTTP 协议和辅助功能,最终生成一个仅支持 IPv4 + HTTP 1.1、零外部依赖、体积极小的 curl 可执行程序,适用于资源受限的嵌入式 Linux 设备。

1.下载libcurl库
地址:https://curl.haxx.se/download/
下载后解压:unzip curl-x.xx.x.zip
2.交叉编译
在Linux中通过你自己所对应的交叉编译工具链 进行编译;
例如

make distclean

export SYSROOT=/usr/aarch64-linux-gnu

./configure \
--prefix=/home/XXX/make_Curl \
--host=aarch64-linux-gnu \
--build=x86_64-pc-linux-gnu \
CC="aarch64-linux-gnu-gcc --sysroot=$SYSROOT" \
CXX="aarch64-linux-gnu-g++ --sysroot=$SYSROOT" \
AR=aarch64-linux-gnu-ar \
RANLIB=aarch64-linux-gnu-ranlib \
STRIP=aarch64-linux-gnu-strip \
CPPFLAGS="-I$SYSROOT/usr/include" \
LDFLAGS="-L$SYSROOT/lib -L$SYSROOT/usr/lib" \
--without-ssl \
--without-libpsl \
--without-libidn2 \
--without-brotli \
--without-zstd \
--without-nghttp2 \
--without-zlib \
--disable-ipv6 \
--disable-ftp \
--disable-tftp \
--disable-smb \
--disable-gopher \
--disable-telnet \
--disable-ldap \
--disable-ldaps \
--disable-rtsp \
--disable-pop3 \
--disable-imap \
--disable-smtp \
--disable-mqtt \
--disable-dict \
--disable-file \
--disable-manual \
--disable-docs

完整脚本逐行解析(交叉编译 aarch64 平台 curl,极简 http 专用版本)

1. 前置清理

make distclean
  • 作用:彻底清空之前编译产生的所有中间文件、Makefile、配置缓存;
  • 场景:多次重新编译前必执行,避免旧配置缓存导致交叉编译异常。

2. 定义交叉编译根文件系统

export SYSROOT=/usr/aarch64-linux-gnu
  • SYSROOT:ARM64 (aarch64) 平台系统库、头文件根目录;
  • 交叉编译时,编译器会从此路径读取目标平台的 .h 头文件、.so/.a 库,而非主机 x86 的系统文件。

3. configure 交叉编译核心参数分段拆解

基础安装路径

--prefix=/home/XXX/make_Curl

编译完成后执行 make install,所有库、头文件、curl 二进制都会安装到该目录,方便单独打包拷贝到嵌入式设备,不污染主机系统。

编译平台三要素(交叉编译关键)

--host=aarch64-linux-gnu
--build=x86_64-pc-linux-gnu
  • --build编译主机,当前电脑 x86_64 Linux;
  • --host目标运行平台,程序最终跑在 aarch64 嵌入式板子; configure 依靠这两个参数自动切换交叉编译逻辑。

交叉编译工具链指定

CC="aarch64-linux-gnu-gcc --sysroot=$SYSROOT"
CXX="aarch64-linux-gnu-g++ --sysroot=$SYSROOT"
AR=aarch64-linux-gnu-ar
RANLIB=aarch64-linux-gnu-ranlib
STRIP=aarch64-linux-gnu-strip
  1. CC/CXX:C/C++ 交叉编译器,携带 --sysroot 指定目标系统根目录,编译器自动链接 aarch64 库;
  2. AR:静态库打包工具;
  3. RANLIB:为静态库生成索引,加速链接;
  4. STRIP:后期裁剪可执行文件多余调试符号,减小嵌入式固件体积。

头文件 / 库文件搜索路径

CPPFLAGS="-I$SYSROOT/usr/include"
LDFLAGS="-L$SYSROOT/lib -L$SYSROOT/usr/lib"
  • CPPFLAGS:预编译参数,-I 指定 aarch64 平台头文件目录;
  • LDFLAGS:链接参数,-L 指定 aarch64 系统库搜索路径; 防止编译时误引用主机 x86 的头文件 / 库导致架构不匹配报错。

4. --without-xxx:禁用所有第三方依赖

--without-ssl          # 关闭SSL/TLS,不支持https,仅纯http
--without-libpsl       # 不启用域名后缀解析库
--without-libidn2      # 关闭国际化域名支持
--without-brotli       # 不支持brotli压缩
--without-zstd         # 不支持zstd压缩
--without-nghttp2      # 关闭HTTP2,仅HTTP1.1
--without-zlib         # 关闭gzip/deflate压缩

目的:零外部第三方库依赖,编译出来的 curl 不依赖 openssl、zlib 等,嵌入式部署最简单。

5. --disable-xxx:禁用全部非 HTTP 协议与多余功能

网络协议全部关闭

--disable-ipv6    # 不支持IPv6,仅IPv4
--disable-ftp --disable-tftp --disable-smb --disable-gopher
--disable-telnet --disable-ldap --disable-ldaps --disable-rtsp
--disable-pop3 --disable-imap --disable-smtp --disable-mqtt
--disable-dict --disable-file

仅保留 HTTP/HTTPS(这里又关了 ssl,只剩纯 HTTP),砍掉所有文件传输、邮件、物联网、流媒体协议,大幅减小最终程序体积。

文档 / 辅助功能关闭

--disable-manual
--disable-docs

不生成 man 手册、html 文档,减少编译产物与编译耗时。

整体编译目标总结

  1. 平台:x86 主机交叉编译 aarch64 (ARM64) 架构 curl;
  2. 功能:仅支持 IPv4 + HTTP 1.1,无 HTTPS、无压缩、无 HTTP2、无其他任何协议;
  3. 依赖:完全不依赖第三方库,静态链接系统基础 libc;
  4. 产物:安装到自定义目录,体积极小,适合资源受限的嵌入式 Linux 设备;
  5. 适用场景:仅需要简单 http get/post 接口的工控 / 移远模组 Linux 系统。

后续编译命令补充

配置完成后执行编译安装:

make -j$(nproc)
make install

安装目录 /home/XXX/make_Curl 下:

  • bin/curl:可执行程序
  • lib/libcurl.a:静态库(可集成到自己的 C/C++ 程序)
  • include/curl:开发头文件
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐