curl 交叉编译移植到 ARM64 平台指南
curl、aarch64交叉编译器、openssl、zlib源代码下载见如下地址:
https://download.csdn.net/download/qq_40843427/93079498
一、概述
本文档记录如何在 x86_64 Linux 主机上,使用 ARM 官方 GCC 13.3 工具链,交叉编译 curl 并移植到 ARM64 平台。
环境信息
| 编译主机 | x86_64 Linux (Ubuntu/Debian) |
| 目标平台 | ARM64 (aarch64) Linux |
| 交叉编译器 | ARM GNU Toolchain 13.3.Rel1 (GCC 13.3.1) |
| curl 版本 | 8.11.1 |
| OpenSSL 版本 | 3.4.1 |
| zlib 版本 | 1.3.1 |
依赖关系
OpenSSL (交叉编译) ──┐
├──→ curl (交叉编译) ──→ ARM64 可执行文件/libcurl
zlib (交叉编译) ──┘
- OpenSSL:提供 HTTPS 支持
- zlib:提供压缩传输(gzip)支持
二、下载并安装 ARM64 交叉编译工具链
2.1 下载地址
| GCC 13.3(推荐) | https://developer.arm.com/-/media/Files/downloads/gnu/13.3.rel1/binrel/arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz |
| GCC 12.3 | https://developer.arm.com/-/media/Files/downloads/gnu/12.3.rel1/binrel/arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz |
| GCC 11.3 | https://developer.arm.com/-/media/Files/downloads/gnu/11.3.rel1/binrel/gcc-arm-11.3-2022.07-x86_64-aarch64-none-linux-gnu.tar.xz |
官方工具链主页:https://developer.arm.com/downloads/-/gnu-a
2.2 安装步骤
# 1. 下载工具链
curl -L -o arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz \\
"https://developer.arm.com/-/media/Files/downloads/gnu/13.3.rel1/binrel/arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz"
# 2. 解压(有 sudo 权限解压到 /opt,否则解压到用户目录)
# 方式一:解压到 /opt
sudo tar xJf arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/
# 方式二:解压到用户目录
mkdir -p ~/arm64-tools
tar xJf arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C ~/arm64-tools/
# 3. 设置 PATH 环境变量(写入 ~/.bashrc 永久生效)
echo 'export PATH=~/arm64-tools/arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
# 4. 验证安装
aarch64-none-linux-gnu-gcc –version
2.3 命名说明
| aarch64-none-linux-gnu-gcc | ARM 官方工具链,面向 Linux 目标 ✅ |
| aarch64-linux-gnu-gcc | 系统包 / Linaro 命名,功能相同 |
| aarch64-none-elf-gcc | 裸机目标 ❌,不要选错 |
aarch64-none-linux-gnu 与 aarch64-linux-gnu 功能完全相同,只是命名规范不同。
2.4 创建符号链接(可选)
如需使用 aarch64-linux-gnu-gcc 名称:
TOOLCHAIN=~/arm64-tools/arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu/bin
for f in $TOOLCHAIN/aarch64-none-linux-gnu-*; do
newname=$(echo $f | sed 's/aarch64-none-linux-gnu/aarch64-linux-gnu/')
ln -sf $f $newname
done
三、下载源码
3.1 curl 源码
# 官网下载
wget https://curl.se/download/curl-8.11.1.tar.gz
tar xzf curl-8.11.1.tar.gz
# 或从 GitHub 克隆
git clone https://github.com/curl/curl.git
cd curl && git checkout curl-8_11_1
3.2 zlib 源码
# GitHub releases 下载
wget https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gz
tar xzf zlib-1.3.1.tar.gz
3.3 OpenSSL 源码
# 官网下载
wget https://www.openssl.org/source/openssl-3.4.1.tar.gz
tar xzf openssl-3.4.1.tar.gz
3.4 下载后的目录结构
/home/jinpan/desktop/curl_prj/
├── curl-8.11.1/ ← curl 源码
├── zlib-1.3.1/ ← zlib 源码
├── openssl-3.4.1/ ← OpenSSL 源码
└── arm64-deps/ ← 交叉编译产物安装目录(后续创建)
四、交叉编译
4.1 编译 zlib
操作目录: zlib-1.3.1
cd zlib-1.3.1
CC=aarch64-none-linux-gnu-gcc \\
./configure –prefix=/home/jp/desktop/curl_prj/arm64-deps/zlib –static
make -j$(nproc)
make install
| CC=aarch64-none-linux-gnu-gcc | 指定交叉编译器 |
| –prefix=…/arm64-deps/zlib | 安装目录 |
| –static | 只编译静态库 |
产物:
arm64-deps/zlib/
├── lib/libz.a ← ARM64 静态库
├── include/zlib.h
└── include/zconf.h
4.2 编译 OpenSSL
操作目录: openssl-3.4.1
cd openssl-3.4.1
./Configure linux-aarch64 \\
–prefix=/home/jp/desktop/curl_prj/arm64-deps/openssl \\
–cross-compile-prefix=aarch64-none-linux-gnu- \\
no-shared \\
no-tests
make -j$(nproc)
make install_sw
| linux-aarch64 | 目标平台:Linux + ARM64 |
| –prefix=…/arm64-deps/openssl | 安装目录 |
| –cross-compile-prefix=aarch64-none-linux-gnu- | 交叉编译器前缀(注意末尾有 -) |
| no-shared | 只编译静态库 |
| no-tests | 跳过测试 |
| make install_sw | 只安装库和头文件,不安装文档 |
注意: OpenSSL 使用 ./Configure(大写 C),不是 ./configure。
产物:
arm64-deps/openssl/
├── lib/
│ ├── libssl.a ← ARM64 静态库
│ └── libcrypto.a ← ARM64 静态库
├── include/openssl/ ← 头文件
└── bin/openssl ← ARM64 openssl 工具
4.3 编译 curl
操作目录: curl-8.11.1
cd curl-8.11.1
./configure \\
–host=aarch64-none-linux-gnu \\
–build=x86_64-linux-gnu \\
–prefix=/home/jp/desktop/curl_prj/arm64-deps/curl \\
–with-openssl=/home/jp/desktop/curl_prj/arm64-deps/openssl \\
–with-zlib=/home/jp/desktop/curl_prj/arm64-deps/zlib \\
–disable-shared \\
–enable-static \\
–without-libpsl
make -j$(nproc)
make install
| –host=aarch64-none-linux-gnu | 目标平台(运行程序的机器) |
| –build=x86_64-linux-gnu | 编译主机平台(当前 x86 机器) |
| –prefix=…/arm64-deps/curl | 安装目录 |
| –with-openssl=…/arm64-deps/openssl | 指向交叉编译好的 OpenSSL |
| –with-zlib=…/arm64-deps/zlib | 指向交叉编译好的 zlib |
| –disable-shared | 不编译动态库(.so) |
| –enable-static | 编译静态库(.a) |
| –without-libpsl | 禁用 libpsl(避免编译报错,对功能无影响) |
产物:
arm64-deps/curl/
├── bin/curl ← ARM64 可执行程序
├── lib/
│ ├── libcurl.a ← ARM64 静态库(供其他程序链接)
│ └── pkgconfig/libcurl.pc
└── include/curl/ ← 头文件
4.4 可选:精简裁剪(嵌入式场景)
在 curl configure 时可额外添加以下参数关闭不需要的协议,减小体积:
–disable-ldap –disable-ldaps # LDAP
–disable-rtsp # RTSP
–disable-dict # DICT
–disable-telnet # Telnet
–disable-pop3 –disable-imap # 邮件协议
–disable-smb # SMB
–disable-smtp # SMTP
–disable-gopher # Gopher
–disable-mqtt # MQTT
–disable-manual # 帮助文档
编译优化参数:
–enable-symbol-hiding # 隐藏内部符号
–enable-optimize # 开启编译优化
CFLAGS="-Os -s" # 体积优化
LDFLAGS="-Wl,–gc-sections -Wl,-s"
五、验证产物
# 1. 确认是 ARM64 架构
file /home/jp/desktop/curl_prj/arm64-deps/curl/bin/curl
# 期望输出: ELF 64-bit LSB executable, ARM aarch64
# 2. 查看 curl 版本和功能
aarch64-none-linux-gnu-strings /home/jp/desktop/curl_prj/arm64-deps/curl/bin/curl | grep -i "curl/"
# 3. 检查是否链接了 OpenSSL(HTTPS 支持)
aarch64-none-linux-gnu-nm /home/jp/desktop/curl_prj/arm64-deps/curl/bin/curl | grep -i "SSL_CTX_new"
# 4. 查看产物目录
ls -la /home/jp/desktop/curl_prj/arm64-deps/curl/bin/
ls -la /home/jp/desktop/curl_prj/arm64-deps/curl/lib/
六、部署到 ARM64 目标板
6.1 静态链接版(只需拷贝一个文件)
# 从主机拷贝到目标板
scp /home/jp/desktop/curl_prj/arm64-deps/curl/bin/curl user@<目标板IP>:/usr/local/bin/
# 在目标板上执行
chmod +x /usr/local/bin/curl
curl –version
curl -k https://www.baidu.com
6.2 动态链接版(需同步 .so 库)
如果编译时未加 –disable-shared,需要同步动态库:
# 拷贝二进制和库文件
scp /home/jp/desktop/curl_prj/arm64-deps/curl/bin/curl user@<目标板IP>:/usr/local/bin/
scp /home/jp/desktop/curl_prj/arm64-deps/openssl/lib/libssl.so* user@<目标板IP>:/usr/local/lib/
scp /home/jp/desktop/curl_prj/arm64-deps/openssl/lib/libcrypto.so* user@<目标板IP>:/usr/local/lib/
# 在目标板上刷新动态链接库缓存
ldconfig
七、集成到自己的项目
如果需要在自己的 C/C++ 项目中使用 libcurl:
7.1 编译
aarch64-none-linux-gnu-gcc my_program.c \\
-I/home/jp/desktop/curl_prj/arm64-deps/curl/include \\
-L/home/jp/desktop/curl_prj/arm64-deps/curl/lib \\
-L/home/jp/desktop/curl_prj/arm64-deps/openssl/lib \\
-L/home/jp/desktop/curl_prj/arm64-deps/zlib/lib \\
-lcurl -lssl -lcrypto -lz -lpthread \\
-o my_program_arm64
7.2 使用 pkg-config(更简洁)
export PKG_CONFIG_PATH=/home/jp/desktop/curl_prj/arm64-deps/curl/lib/pkgconfig
aarch64-none-linux-gnu-gcc my_program.c \\
$(pkg-config –cflags –libs –static libcurl) \\
-o my_program_arm64
八、最终产物目录结构
arm64-deps/
├── zlib/
│ ├── lib/
│ │ └── libz.a ← zlib 静态库
│ └── include/
│ ├── zlib.h
│ └── zconf.h
├── openssl/
│ ├── lib/
│ │ ├── libssl.a ← OpenSSL SSL 静态库
│ │ └── libcrypto.a ← OpenSSL crypto 静态库
│ ├── include/openssl/ ← OpenSSL 头文件
│ └── bin/openssl ← openssl 工具
└── curl/
├── bin/
│ └── curl ← ARM64 curl 可执行程序
├── lib/
│ ├── libcurl.a ← curl 静态库
│ └── pkgconfig/
└── include/curl/ ← curl 头文件
九、常见问题
Q1: configure 报错 libpsl libs and/or directories were not found
在 curl configure 命令中加 –without-libpsl 即可。禁用后不影响 HTTPS 功能。
Q2: aarch64-none-linux-gnu-gcc 和 aarch64-linux-gnu-gcc 有什么区别?
功能完全相同,只是命名规范不同。none 表示无特定厂商(vendor)。两者生成的二进制完全兼容。
Q3: aarch64-none-linux-gnu 和 aarch64-none-elf 有什么区别?
| aarch64-none-linux-gnu | Linux 目标 ✅ |
| aarch64-none-elf | 裸机(bare-metal)目标 ❌ |
Q4: 如何编译动态库版本?
configure 时去掉 –disable-shared,加上 –enable-shared,同时 OpenSSL 去掉 no-shared,zlib 去掉 –static。
Q5: 编译产物太大如何裁剪?
- 使用 CFLAGS="-Os -s" 优化体积
- 关闭不需要的协议(参见 4.4 节)
- 使用 strip 命令去除符号:aarch64-none-linux-gnu-strip arm64-deps/curl/bin/curl
十、参考链接
| ARM 官方工具链下载 | https://developer.arm.com/downloads/-/gnu-a |
| curl 官网 | https://curl.se/ |
| OpenSSL 官网 | https://www.openssl.org/ |
| zlib GitHub | https://github.com/madler/zlib |





