欢迎光临
我们一直在努力

curl 交叉编译并移植到 ARM64 平台

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
赞(0)
未经允许不得转载:171主机测评 » curl 交叉编译并移植到 ARM64 平台
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址