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

📅 发布时间:2026/7/7 8:54:24 👁️ 浏览次数:
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.1OpenSSL 版本3.4.1zlib 版本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.xzGCC 12.3https://developer.arm.com/-/media/Files/downloads/gnu/12.3.rel1/binrel/arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xzGCC 11.3https://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-a2.2 安装步骤# 1. 下载工具链curl-L-oarm-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否则解压到用户目录# 方式一解压到 /optsudotarxJf arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz-C/opt/# 方式二解压到用户目录mkdir-p~/arm64-toolstarxJf arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz-C~/arm64-tools/# 3. 设置 PATH 环境变量写入 ~/.bashrc 永久生效echoexport PATH~/arm64-tools/arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu/bin:$PATH~/.bashrcsource~/.bashrc# 4. 验证安装aarch64-none-linux-gnu-gcc--version2.3 命名说明工具链名称含义aarch64-none-linux-gnu-gccARM 官方工具链面向 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/binforfin$TOOLCHAIN/aarch64-none-linux-gnu-*;donewname$(echo$f|seds/aarch64-none-linux-gnu/aarch64-linux-gnu/)ln-sf$f$newnamedone三、下载源码3.1 curl 源码# 官网下载wgethttps://curl.se/download/curl-8.11.1.tar.gztarxzf curl-8.11.1.tar.gz# 或从 GitHub 克隆gitclone https://github.com/curl/curl.gitcdcurlgitcheckout curl-8_11_13.2 zlib 源码# GitHub releases 下载wgethttps://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gztarxzf zlib-1.3.1.tar.gz3.3 OpenSSL 源码# 官网下载wgethttps://www.openssl.org/source/openssl-3.4.1.tar.gztarxzf openssl-3.4.1.tar.gz3.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.1cdzlib-1.3.1CCaarch64-none-linux-gnu-gcc\./configure--prefix/home/jinpan/desktop/curl_prj/arm64-deps/zlib--staticmake-j$(nproc)makeinstall参数说明CCaarch64-none-linux-gnu-gcc指定交叉编译器--prefix.../arm64-deps/zlib安装目录--static只编译静态库产物arm64-deps/zlib/ ├── lib/libz.a ← ARM64 静态库 ├── include/zlib.h └── include/zconf.h4.2 编译 OpenSSL操作目录openssl-3.4.1cdopenssl-3.4.1 ./Configure linux-aarch64\--prefix/home/jinpan/desktop/curl_prj/arm64-deps/openssl\--cross-compile-prefixaarch64-none-linux-gnu-\no-shared\no-testsmake-j$(nproc)makeinstall_sw参数说明linux-aarch64目标平台Linux ARM64--prefix.../arm64-deps/openssl安装目录--cross-compile-prefixaarch64-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.1cdcurl-8.11.1 ./configure\--hostaarch64-none-linux-gnu\--buildx86_64-linux-gnu\--prefix/home/jinpan/desktop/curl_prj/arm64-deps/curl\--with-openssl/home/jinpan/desktop/curl_prj/arm64-deps/openssl\--with-zlib/home/jinpan/desktop/curl_prj/arm64-deps/zlib\--disable-shared\--enable-static\--without-libpslmake-j$(nproc)makeinstall参数说明--hostaarch64-none-linux-gnu目标平台运行程序的机器--buildx86_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/jinpan/desktop/curl_prj/arm64-deps/curl/bin/curl# 期望输出: ELF 64-bit LSB executable, ARM aarch64# 2. 查看 curl 版本和功能aarch64-none-linux-gnu-strings /home/jinpan/desktop/curl_prj/arm64-deps/curl/bin/curl|grep-icurl/# 3. 检查是否链接了 OpenSSLHTTPS 支持aarch64-none-linux-gnu-nm /home/jinpan/desktop/curl_prj/arm64-deps/curl/bin/curl|grep-iSSL_CTX_new# 4. 查看产物目录ls-la/home/jinpan/desktop/curl_prj/arm64-deps/curl/bin/ls-la/home/jinpan/desktop/curl_prj/arm64-deps/curl/lib/六、部署到 ARM64 目标板6.1 静态链接版只需拷贝一个文件# 从主机拷贝到目标板scp/home/jinpan/desktop/curl_prj/arm64-deps/curl/bin/curl user目标板IP:/usr/local/bin/# 在目标板上执行chmodx /usr/local/bin/curlcurl--versioncurl-khttps://www.baidu.com6.2 动态链接版需同步 .so 库如果编译时未加--disable-shared需要同步动态库# 拷贝二进制和库文件scp/home/jinpan/desktop/curl_prj/arm64-deps/curl/bin/curl user目标板IP:/usr/local/bin/scp/home/jinpan/desktop/curl_prj/arm64-deps/openssl/lib/libssl.so* user目标板IP:/usr/local/lib/scp/home/jinpan/desktop/curl_prj/arm64-deps/openssl/lib/libcrypto.so* user目标板IP:/usr/local/lib/# 在目标板上刷新动态链接库缓存ldconfig七、集成到自己的项目如果需要在自己的 C/C 项目中使用 libcurl7.1 编译aarch64-none-linux-gnu-gcc my_program.c\-I/home/jinpan/desktop/curl_prj/arm64-deps/curl/include\-L/home/jinpan/desktop/curl_prj/arm64-deps/curl/lib\-L/home/jinpan/desktop/curl_prj/arm64-deps/openssl/lib\-L/home/jinpan/desktop/curl_prj/arm64-deps/zlib/lib\-lcurl-lssl-lcrypto-lz-lpthread\-omy_program_arm647.2 使用 pkg-config更简洁exportPKG_CONFIG_PATH/home/jinpan/desktop/curl_prj/arm64-deps/curl/lib/pkgconfig aarch64-none-linux-gnu-gcc my_program.c\$(pkg-config--cflags--libs--staticlibcurl)\-omy_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-gnuLinux 目标 ✅aarch64-none-elf裸机bare-metal目标 ❌Q4: 如何编译动态库版本configure 时去掉--disable-shared加上--enable-shared同时 OpenSSL 去掉no-sharedzlib 去掉--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-acurl 官网https://curl.se/OpenSSL 官网https://www.openssl.org/zlib GitHubhttps://github.com/madler/zlib