linux编译curl(带openssl)

您所在的位置:网站首页 敬颂教安的意思 linux编译curl(带openssl)

linux编译curl(带openssl)

#linux编译curl(带openssl)| 来源: 网络整理| 查看: 265

我的操作系统:ubuntu 20.04(理论上只要是linux就行)

从github上下载了curl和openssl1.1.1d(说实话并不知道这个1.1.1d是什么意思),总之,我拉的都是最新的代码。

带openssl的目的是为了能够发送https请求,否则只能发送http请求。

我这边新建了个文件夹叫做curl_test(名字任意),然后把curl和openssl都解压到这个文件夹下。

先编译openssl

进入到openssl目录下,阅读README后发现,编译openssl需要查看INSTALL这个文件,那就去看一下吧。

README:

INSTALL:

查看INSTALL可以发现,在linux下编译,要运行config这个文件,注意在openssl目录下还有个Configure文件,不要搞错了哦。

我在openssl目录下新建了个文件家build,用来存放生成的结果(--prefix=xxxx/build),当然大家可以根据习惯来取名字,或者直接生成到/usr/local目录下等等,都是可以的。

依次执行如下命令即可完成安装

./config --prefix=/home/lenovo/FM/curl_test/openssl-OpenSSL_1_1_1d/build make make install

然后来编译curl

首先切换到curl目录下,通过各种查看README啊之类的,最后锁定到要看GIT-INFO:

发现需要先使用如下命令来生成configure(在curl目录下执行即可)

autoreconf -fi

同样新建一个build文件夹,因为要带openssl编译,所以执行如下命令即可成功编译curl。

./configure --prefix=/home/lenovo/FM/curl_test/curl-master/build --with-openssl=/home/lenovo/FM/curl_test/openssl-OpenSSL_1_1_1d/build make make install

其中--with-openssl后面跟的路径,是openssl生成的lib、include、bin所在的路径,如下图所示:

编译完成后可以看到curl的build目录下:

通过以上步骤,成功完成了curl的编译(带openssl)。

事不宜迟,来试一个demo吧。

在curl目录下的doc/examples目录下,有个https.c,是一个发送https请求的demo,如下所示:

#include #include int main(void) { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/"); #ifdef SKIP_PEER_VERIFICATION /* * If you want to connect to a site who is not using a certificate that is * signed by one of the certs in the CA bundle you have, you can skip the * verification of the server's certificate. This makes the connection * A LOT LESS SECURE. * * If you have a CA cert for the server stored someplace else than in the * default bundle, then the CURLOPT_CAPATH option might come handy for * you. */ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); #endif #ifdef SKIP_HOSTNAME_VERIFICATION /* * If the site you are connecting to uses a different host name that what * they have mentioned in their server certificate's commonName (or * subjectAltName) fields, libcurl will refuse to connect. You can skip * this check, but this will make the connection less secure. */ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); #endif /* Perform the request, res will get the return code */ res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); /* always cleanup */ curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; }

在当前目录(doc/examples)下新建一个makefile文件,注意m小写,因为当前目录下还有一个Makefile文件。

makefile:

https_test:https.c gcc -o $@ $^ -I/home/lenovo/FM/curl_test/curl-master/build/include -L/home/lenovo/FM/curl_test/curl-master/build/lib -lcurl .PHONY:clean clean: rm -rf https_test

大概是如上这么写的,注意把路径换成自己的路径。

执行make,然后执行./https_test,结果如下图所示,显然,这个curl有一个自己的测试服务器,所以这里给https://example.com/发送https请求可以得到响应。

再提一嘴,如果想要编译arm版的curl,需要在./configure这一行命令中加上:

--host=arm-linux

如果不加这一句,默认编译x86版本的。(我的理解应该没错吧?),

还有呢,就是要指定编译器,也是在./configure这一行命令中加,前提是电脑里有这个编译器,比如:

CC=arm-linux-gnueabihf-gcc

最后,为什么使用--with-openssl这个参数指定了路径就可以找到openssl,而不是指定include路径、lib路径等等的呢?

这是因为,编译curl的时候会去--with-openssl指定路径下的 lib/pkgconfig目录下寻找openssl的 .pc文件,从而进一步得到curl依赖的openssl的include目录、lib目录等等。

因此,如果编译的时候已经指定了--with-openssl路径,却始终报错检测不到openssl,比如我下面这个报错:

configure: error: --with-openssl was given but OpenSSL could not be detected

不妨去看看这些.pc文件里的路径对不对呢!都是踩过的坑啊!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3