linux编译curl(带openssl) |
您所在的位置:网站首页 › 敬颂教安的意思 › linux编译curl(带openssl) |
我的操作系统: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 |