curl-7.57.0源码包编译安装和移植

Linux系统中一般自带curl命令,大部分选项和参数基本能满足日常工作需要。对于一些新的功能就需要是用编译安装的版本。本文编译安装的目的主要是让 curl 支持 --dns-servers,实现 DNS 解析。

Man Page:https://curl.haxx.se/docs/manpage.html

编译安装 OpenSSL

要保证安装后的 OpenSSL 能兼容 CentOS6 以上系统针对 https 协议内容的访问,需要依赖较高版本的 OpenSSL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yum -y install perl perl-devel
# 源码安装openssl需要perl编译环境

wget --no-check-certificate https://www.openssl.org/source/old/1.0.2/openssl-1.0.2m.tar.gz ;
tar xf openssl-1.0.2m.tar.gz ;
cd openssl-1.0.2m ;
./config -fPIC --prefix=/usr/local/openssl/ enable-shared

# --prefix:指定安装目录
# -fPIC:编译 openssl 的静态库
# enable-shared:编译动态库

make && make install

/usr/local/openssl/bin/openssl version
# 版本查看

库文件配置

1
2
3
4
5
6
7
8
echo "/usr/local/openssl/lib/" >> /etc/ld.so.conf.d/openssl-1.0.2m.conf
# 将库文件路径写入/etc/ld.so.conf文件中,方便调用库文件

ldconfig
# 在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库

ldconfig -p | grep '/usr/local/openssl/lib'
# 打印出当前缓存文件所保存的所有共享库的名字并过滤openssl相关项

编译安装 c-ares

c-ares是一个C语言的异步DNS解析库,可以很方便的和使用者的事件循环统一起来,实现DNS的非阻塞异步解析,libcurl, libevent, gevent, nodejs 都在使用。curl 如果需要使用 --dns-servers 参数的话要在编译 curl 时对c-ares 进行支持

1
2
3
4
5
wget https://c-ares.haxx.se/download/c-ares-1.12.0.tar.gz
tar xf c-ares-1.12.0.tar.gz
cd c-ares-1.12.0
./configure --prefix=/usr/local/c-ares-1.12.0
make && make install

编译安装 curl-7.57.0

CURL 的官方安装文档:http://curl.haxx.se/docs/install.html

1
2
3
4
5
6
7
8
9
10
11
12
13
wget https://curl.haxx.se/download/curl-7.57.0.tar.bz2
tar xf curl-7.57.0.tar.bz2
cd curl-7.57.0
./configure --prefix=/usr/local/curl-7.57.0/ --enable-ares=/usr/local/c-ares-1.12.0/ --with-ssl=/usr/local/openssl/ LIBS="-ldl -lrt "
# 需要依赖的库:libdl.so.2、librt.so.1,因此需要使用LABS参数指定库连接

make && make install

/usr/local/curl-7.57.0/bin/curl -V
# 查看版本

ln -sv /usr/local/curl-7.57.0/bin/curl /usr/local/sbin/curl7
# 创建软连接

测试

1
2
3
4
5
6
7
8
9
10
11
12
curl7  -I --dns-servers 8.8.8.8 www.baidu.com
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Fri, 19 Jan 2018 14:59:44 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:25 GMT
Connection: Keep-Alive
ETag: "575e1f71-115"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes

源码包的移植

编译好的包需要依赖很多库,为了解决移植后的库依赖的问题,我们可以在移植之前将所有依赖的库拷贝到程序的 lib目录下

使用 ldd 命令列出动态库依赖关系

1
2
3
4
5
6
7
8
9
10
11
[root@Test ~]$ ldd /usr/local/curl-7.57.0/bin/curl
linux-vdso.so.1 => (0x00007fffb6df5000)
libcurl.so.4 => /usr/local/curl-7.57.0/lib/libcurl.so.4 (0x00002ac39067a000)
libssl.so.1.0.0 => /usr/local/curl-7.57.0/lib/libssl.so.1.0.0 (0x00002ac3908e3000)
libcrypto.so.1.0.0 => /usr/local/curl-7.57.0/lib/libcrypto.so.1.0.0 (0x00002ac390b4f000)
librt.so.1 => /usr/local/curl-7.57.0/lib/librt.so.1 (0x0000003184000000)
libc.so.6 => /usr/local/curl-7.57.0/lib/libc.so.6 (0x0000003182400000)
libcares.so.2 => /usr/local/c-ares-1.12.0/lib/libcares.so.2 (0x00002ac390f65000)
libdl.so.2 => /usr/local/curl-7.57.0/lib/libdl.so.2 (0x0000003182800000)
libpthread.so.0 => /usr/local/curl-7.57.0/lib/libpthread.so.0 (0x0000003182c00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003182000000)

拷贝相关的库到程序的lib目录

1
2
3
cp /usr/local/openssl/lib/libssl.so.1.0.0     /usr/local/curl-7.57.0/lib/
cp /usr/local/openssl/lib/libcrypto.so.1.0.0 /usr/local/curl-7.57.0/lib/
cp /usr/local/c-ares-1.12.0/lib/libcares.so.2 /usr/local/curl-7.57.0/lib/

创建可移植的压缩包

1
2
cd /usr/local/
tar -jcf curl-7.57.0.tar.bz2 curl-7.57.0

使用 scp 命令从本机移植到另外一台机器X,在 X 机器添加库搜索路径

1
2
3
4
5
6
7
8
9
scp -P 22 curl-7.57.0.tar.bz2  XXX.XXX.XXX.XXX:/opt/
ssh -p 22 XXX.XXX.XXX.XXX

# 以下操作均在X机器上执行
cd /opt/
tar xf curl-7.57.0.tar.bz2 -C /usr/local/
echo '/usr/local/curl-7.57.0/lib/' > /etc/ld.so.conf.d/curl-7.57.0.conf
ldconfig
ln -sv /usr/local/curl-7.57.0/bin/curl /usr/local/sbin/curl7

测试

1
2
3
4
5
6
7
8
9
10
11
12
/curl7  -I --dns-servers 8.8.8.8 www.baidu.com
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Sat, 20 Jan 2018 08:16:53 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:26 GMT
Connection: Keep-Alive
ETag: "575e1f72-115"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes
有钱任性,请我吃包辣条
0%