curl、openssl、mbedtls的交叉编译过程

一、前言

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机上使用。

扫描二维码关注公众号,回复: 14598470 查看本文章

修改生成的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/目录下的用于编程的库文件。

猜你喜欢

转载自blog.csdn.net/fun_tion/article/details/127752529