交叉编译curl

本文介绍如何在ARM平台上交叉编译一个不使用SSL的静态库CURL,以满足基本使用需求。提供了详细的编译命令,并分享了动态库编译后在ARM板卡上运行时遇到的错误信息。

使用下面的命令可以交叉编译出一个不使用SSL的curl,满足基本的使用。使用的是静态库,动态库的编译虽然编译成功,但是在arm板卡上运行老是报错。最后把报错信息发布出来。有高手可以帮助解决一下。
交叉编译命令:
1、./configure --host=arm-linux CC=/home/keda/work/K2_LEDE-STABLE-17.01/staging_dir/toolchain-arm_cortex-a7+neon-vfpv4_gcc-5.4.0_musl-1.1.16_eabi/bin/arm-openwrt-linux-gcc CXX=/home/keda/work/K2_LEDE-STABLE-17.01/staging_dir/toolchain-arm_cortex-a7+neon-vfpv4_gcc-5.4.0_musl-1.1.16_eabi/bin/arm-openwrt-linux-g++ --without-ssl --disable-shared --enable-static --prefix=/home/keda/curl编译/curl_arm
2、make
3、make install

动态库报错信息:

Error relocating ./curl: curl_url: symbol not found
Error relocating ./curl: curl_mime_data_cb: symbol not found
Error relocating ./curl: curl_mime_name: symbol not found
Error relocating ./curl: curl_mime_encoder: symbol not found
Error relocating ./curl: curl_mime_init: symbol not found
Error relocating ./curl: curl_mime_headers: symbol not found
Error relocating ./curl: curl_multi_poll: symbol not found
Error relocating ./curl: curl_mime_filedata: symbol not found
Error relocating ./curl: curl_mime_free: symbol not found
Error relocating ./curl: curl_mime_subparts: symbol not found
Error relocating ./curl: curl_url_set: symbol not found
Error relocating ./curl: curl_url_cleanup: symbol not found
Error relocating ./curl: curl_mime_type: symbol not found
Error relocating ./curl: curl_mime_addpart: symbol not found
Error relocating ./curl: curl_mime_filename: symbol not found
Error relocating ./curl: curl_url_get: symbol not found
Error relocating ./curl: curl_mime_data: symbol not found

在 Linux 下**交叉编译 `curl`** 是一个常见的需求,尤其是在为嵌入式设备、ARM 开发板、Android、IoT 设备等目标平台构建 `curl` 二进制文件时。 交叉编译意味着你在一种架构(如 x86_64)上编译程序,但目标运行环境是另一种架构(如 ARM、MIPS、RISC-V 等)。 --- ## 🛠️ 交叉编译 curl 的基本流程 ### 1. 准备交叉编译工具链(Cross Toolchain) 你需要一个适用于目标平台的交叉编译工具链,例如: | 目标平台 | 工具链示例 | |----------|------------| | ARM 32-bit | `arm-linux-gnueabi-gcc` | | ARM 64-bit (ARM64/Aarch64) | `aarch64-linux-gnu-gcc` | | MIPS | `mips-linux-gnu-gcc` | | RISC-V | `riscv64-unknown-linux-gnu-gcc` | 你可以从以下方式获取: - 使用发行版仓库安装(如 `sudo apt install gcc-arm-linux-gnueabi`) - 使用 [Buildroot](https://buildroot.org/) - 使用 [crosstool-ng](https://crosstool-ng.github.io/) - 使用 SDK(如 NXP、Rockchip 提供的 SDK) --- ### 2. 下载 curl 源码 ```bash git clone https://github.com/curl/curl.git cd curl ``` 或者下载官方 release: ```bash wget https://curl.se/download/curl-7.85.0.tar.gz tar -zxvf curl-7.85.0.tar.gz cd curl-7.85.0 ``` --- ### 3. 配置交叉编译环境 #### 示例:交叉编译到 ARM64(aarch64) ```bash CC=aarch64-linux-gnu-gcc \ AR=aarch64-linux-gnu-ar \ RANLIB=aarch64-linux-gnu-ranlib \ ./configure \ --host=aarch64-linux-gnu \ --prefix=/usr/local/arm64/curl \ --without-ssl \ --enable-static \ --disable-shared \ --disable-debug \ --with-zlib \ --enable-ipv6 ``` #### 如果你希望启用 SSL/TLS 支持(如 OpenSSL) 你需要先交叉编译并安装 OpenSSL 到目标目录,然后配置: ```bash CC=aarch64-linux-gnu-gcc \ AR=aarch64-linux-gnu-ar \ RANLIB=aarch64-linux-gnu-ranlib \ ./configure \ --host=aarch64-linux-gnu \ --prefix=/usr/local/arm64/curl \ --with-ssl=/usr/local/arm64/openssl \ --enable-static \ --disable-shared \ --disable-debug \ --with-zlib=/usr/local/arm64/zlib \ --enable-ipv6 ``` --- ### 4. 编译和安装 ```bash make -j$(nproc) make install ``` 这会将编译好的 `curl` 可执行文件和库安装到 `--prefix` 指定的目录。 --- ### 5. 检查编译结果 使用 `file` 命令检查生成的二进制是否为目标架构: ```bash file /usr/local/arm64/curl/bin/curl ``` 输出示例(ARM64): ``` /usr/local/arm64/curl/bin/curl: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, for GNU/Linux 3.7.0, not stripped ``` --- ## 🧩 依赖库的交叉编译(如 OpenSSL、zlib) 如果你需要启用 HTTPS 支持,你需要先交叉编译这些库: ### 1. 交叉编译 zlib ```bash CC=aarch64-linux-gnu-gcc \ AR=aarch64-linux-gnu-ar \ RANLIB=aarch64-linux-gnu-ranlib \ ./configure --prefix=/usr/local/arm64/zlib make -j$(nproc) make install ``` ### 2. 交叉编译 OpenSSL ```bash CC=aarch64-linux-gnu-gcc ./Configure linux-arm64 --prefix=/usr/local/arm64/openssl no-shared make -j$(nproc) make install ``` --- ## 📦 部署到目标平台 将安装目录打包后复制到目标设备: ```bash tar -czvf curl-arm64.tar.gz -C /usr/local/arm64/curl . ``` 然后在目标平台上解压并添加到环境变量: ```bash export PATH=/path/to/curl/bin:$PATH ``` --- ## ✅ 示例:完整交叉编译脚本(ARM64 + OpenSSL) ```bash export CC=aarch64-linux-gnu-gcc export AR=aarch64-linux-gnu-ar export RANLIB=aarch64-linux-gnu-ranlib export PREFIX=/usr/local/arm64/curl export OPENSSL_PREFIX=/usr/local/arm64/openssl ./configure \ --host=aarch64-linux-gnu \ --prefix=$PREFIX \ --with-ssl=$OPENSSL_PREFIX \ --enable-static \ --disable-shared \ --disable-debug \ --enable-ipv6 make clean make -j$(nproc) make install ``` --- ## ⚠️ 常见问题及解决方法 | 问题 | 原因 | 解决方法 | |------|------|----------| | 编译失败提示找不到 `ssl.h` | OpenSSL 未正确交叉编译 | 先交叉编译 OpenSSL 并指定路径 | | 编译出的 curl 无法运行 | 依赖库未打包 | 静态链接 `--enable-static` 或打包动态库 | | `configure: error: cannot guess build type` | 缺少 `config.guess` | 使用 `autoreconf -fiv` 重新生成配置 | | `configure: error: C compiler cannot create executables` | 工具链未正确安装 | 检查 `gcc-arm64-linux-gnu` 是否安装 | --- ## ✅ 总结 | 步骤 | 说明 | |------|------| | 1. 安装交叉编译工具链 | 如 `aarch64-linux-gnu-gcc` | | 2. 下载并进入 curl 源码目录 | `git clone https://github.com/curl/curl` | | 3. 设置交叉编译环境变量 | `CC`, `AR`, `RANLIB` | | 4. 配置 configure 参数 | `--host`, `--prefix`, `--with-ssl` | | 5. 编译并安装 | `make && make install` | | 6. 部署到目标设备 | 打包 bin/lib 并部署 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值