一、前言
cURL是一个利用URL语法在命令行下工作的文件传输工具,在Linux系统中常被用来下载或上传文件。curl需依赖openssl或者mbedtls这两个加密库,可以根据实际需要选择其一。本文主要记录如何交叉编译这3个库,使之能运行在嵌入式Linux设备上。
二、环境介绍
宿主机:Ubuntu 18.04.6 LTS 64位
目标机:32位 mips架构 君正T41N
交叉编译器:mips-linux-uclibc-gcc
curl版本:curl-7.58.0
openssl版本:openssl-1.0.0h
mbedtls版本:mbedtls-2.4.2
三、编译openssl和mbedtls
1.准备工作
关于上述3个库的源码,网上一搜一大把,这里不再赘述如何下载。将下载好的源码解压到宿主机Linux系统内。先创建三个目录,用来存放交叉编译生成的库,后续会用到这些目录。目录名字自己取,方便找就行:
/home/user_test/lib_mips_install/openssl-1.0.0h
/home/user_test/lib_mips_install/mbedtls-2.4.2
/home/user_test/lib_mips_install/curl-7.58.0
2.编译openssl
执行以下命令生成Makefile:
cd openssl-OpenSSL_1_0_0h/
./config no-asm shared no-async --prefix=/home/user_test/lib_mips_install/openssl-1.0.0h --cross-compile-prefix=mips-linux-uclibc-
--prefix就是预设的库文件安装路径,填写上一步中创建的目录。这里不能填宿主机系统的/lib目录,因为生成的库文件是交叉编译来的,不能在PC机上使用。
修改生成的Makefile:
PLATFORM=mips
删除文件中所有的-m64
执行以下命令,编译和安装:
make
make install
此时编译生成的库文件就被拷贝到了--prefix指定的目录下。
3.编译mbedtls
执行以下命令编译和安装mbedtls:
cd mbedtls-2.4.2
mkdir _build
cd _build
CC=mips-linux-uclibc-gcc cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On ../ -DCMAKE_INSTALL_PREFIX=/home/user_test/lib_mips_install/mbedtls-2.4.2
make
make install
同样的,通过-DCMAKE_INSTALL_PREFIX指定预设安装目录,选择上面步骤创建的目录。注意要检查系统是否装了cmake工具,一般新装的系统很有可能没有默认带cmake,导致编译失败。上述命令执行成功后,在预设目录下可以看到编译好的mbedtls库文件。
四、编译curl
curl加密依赖库可以选openssl,也可以选mbedtls。我这里为了举例,把两种方式都进行了一遍。
1.依赖openssl-1.0.0h的curl
执行以下命令,编译和安装:
cd curl-7.58.0
./configure --host=mips-linux --target=mips-linux CC=mips-linux-uclibc-gcc CXX=mips-linux-uclibc-g++ --prefix=/home/user_test/lib_mips_install/curl-7.58.0 --with-ssl=/home/user_test/lib_mips_install/openssl-1.0.0h --enable-shared --enable-static --disable-threaded-resolver
make
make install
其中,--with-ssl=/home/user_test/lib_mips_install/openssl-1.0.0h选项指定curl依赖的加密库名称和路径,这个路径填写之前安装openssl的路径。
2.依赖mbedtls-2.4.2的curl
执行如下命令生成编译脚本:
cd curl-7.58.0
./configure --host=mips-linux --target=mips-linux CC=mips-linux-uclibc-gcc --prefix=/home/user_test/lib_mips_install/curl-7.58.0 --with-mbedtls=/home/user_test/lib_mips_install/mbedtls-2.4.2 --enable-shared
其中, --with-mbedtls=/home/user_test/lib_mips_install/mbedtls-2.4.2选项指定curl依赖的加密库名称和路径,这个路径填写之前安装mbedtls的路径。执行这个命令过程中,我遇到了如下的报错:
checking for recv... no
configure: error: Unable to link function recv
网上关于这个问题的资料寥寥无几,只能大致知道可能与zlib的依赖有关,倒腾了半天也没解决。最后是通过更换了编译器的版本解决的。建议遇到类似的问题,可以试试降低或升高编译器的版本。执行成功后,可以看到如下信息:
可以看到编译器已经找到并识别了mbedtls库。在编译之前,还需要vi src/Makefile,252行修改为:
CCLD = $(CC) -lmbedcrypto -lmbedtls -lmbedx509
再执行编译和安装:
make
make install
成功后可以看到在安装目录下的bin/目录下的可执行程序curl,和lib/目录下的用于编程的库文件。