libcurl带openssl文件的编译

    因为工作原因要使用到百度的API,需要使用openssl和libcurl,刚开始以为这两个程序是分开来的,只需要分别添加到工程就可以,结果发现需要libcurl编译带openssl版本的库才可以,而且网上很多教程也是按照别人的程序进行编译,基本都是编译32位的,但是我要使用的是64位,过程还是蛮曲折的,但是也要感谢许多博文给予的一些启发,这篇博文即是一篇记录,也是分享经验。因为文中提及到的很多方法都是别的文章中提取出来的,文章太多也不好每一篇都附上链接。

    编译的环境以及依赖:

1、visual studio 2019

2、openssl 1.1.1版本

3、curl-7.71.1版本

一、编译openssl

    openssl这里花费的时间是最多的,因为很多博文都是使用老版本的,我按照旧版本的方法编译成功了,后来我又找到了新版本(也就是1.1.1版本)的编译,所以这里我都给记录下来。在这里旧版本指的是1.1.0之前的版本,而新版本是1.1.0以后的版本,有些文件和安装方法不同了。因为很多资料都能在其他地方找到,我这里如果详细写下来,恐怕要耗费很多时间,所以像下载什么软件,就自行查找吧,这里只给我的记录。

    无论是新版还是旧版,都要使用两个软件进行安装:nasm和perl,下面是我使用的软件版本。

1、nasm-2.15.02-installer-x64.exe

2、ActivePerl-5.28.1.0000-MSWin32-x64-b462fde1.exe

    注意事项:nasm安装完成之后需要将nasm.exe所在的路径添加到系统的环境路径!!!否则nasm在命令提示符会提示不是内部或外部命令,也不是可运行的程序或批处理文件。安装完成之后,都要在cmd窗口执行版本查询,以确保软件安装配置是没问题的:

1、nasm --version

2、perl --version

    另外还有一点是需要使用visual studio中自带的nmake进行编译,nmake.exe所在路径也要添加到环境变量中。因为不同的vs编译器exe文件所在的路径可能不同,这里只提供我的文件路径:

C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.25.28610\bin\Hostx64\x64

1.0关于perl的config指令

配置config脚本的命令

a、编译release32位:

perl Configure VC-WIN32

b、编译release64位:

perl Configure VC-WIN64A

c、编译debug32位:

perl Configure debug-VC-WIN32

d、编译debug64位:

perl Configure debug-VC-WIN64A

1.1 旧版本的openssl

    这是在win10下使用vs2015编译成功的操作。

1、perl configure VC-WIN64A no-asm -DOPENSSL_USE_IPV6=0

2、ms\do_ms.bat

3、nmake -f ms/ntdll.mak

4、执行命令之后如果没有提示错误,使用下面这个测试命令:

nmake  -f  ms\ntdll.mak test

测试结果,最终显示说明库编译成功:

passed  all  tests

    最后生成的库文件放在了out32dll中,所需要的include文件在inc32中。

1.2 新版本的openssl

关于新版,是按照下面这篇博文中的方法,编译成功,所以需要自行查看:https://www.cnblogs.com/KisonDu/p/10878695.html

范例build.bat文件:

set CURPATH=%~dp0
set TARGET="VC-WIN64A-masm"
set VSCOMNTOOLS="C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvarsall.bat"
set SHARED=
call %VSCOMNTOOLS% x64
mkdir build
cd build
perl ../Configure %TARGET% %SHARED% --prefix="%CURPATH%\build\prefix" --openssldir="%CURPATH%\build\install" --release
perl configdata.pm --dump
nmake build_all_generated
nmake PERL=no-perl
nmake install
cd ..

    其中我们需要根据自己的实际情况修改的几个地方:

1、VSCOMNTOOLS后的参数:修改为编译器的vcvarsall.bat文件所在路径

2、范例中的是64位的程序编译,如果编译32bit的,将TARGET修改为VC-WIN32,call %VSCOMNTOOLS% x64 修改为 call %VSCOMNTOOLS% x86

3、执行 build.bat 文件,并没有像文中所说的那样文件在prefix下面生成对应的文件。所需要的这些lib、dll文件在build文件下。至于这些文件要怎么用,在下一小结会提及。

如果编译成功,cmd窗口会自动关闭。

二、libcurl的编译

    这个操作成功,主要是参考了下面这篇博文:https://www.sindsun.com/articles/16/138

    我的方法有部分是参考博文的,也有我自己想出来的方法,这里记录一下我的操作。

2.1 源码文件

    将GitHub中的7.71.1版本源代码下载了之后,有一个文件是特别重要的,介绍了怎么用visual studio进行编译,博文中也提及了,curl-7.71.1/winbuild目录中,BUILD.WINDOWS.txt文档需要多阅读几遍。

    project——Windows路径下存放的都是各个visual studio版本的sln工程文件,根据VC的版本号进行选择。我这里使用的vs2019也是使用VC15中的工程。

2.2 构建编译的文件

    按照说明的方法,新建deps文件夹,将编译好的openssl文件放到了deps中,我构建的目录如下:

这些文件的位置:

deps下的目录结构:

    bin文件中的内容:

    lib文件中的内容:

   openssl-master——include——openssl中的头文件所在文件夹

    这里需要将include文件放到两个地方,放到后面那个地方是为了工程编译:

2.3 工程配置

    在winbuild——Windows——VC15——lib中打开libcurl.sln工程文件,在这里需要说明一下我这样操作的原因。在VC15文件夹下,包含了三个sln文件,curl-all.sln文件是包含了libcurl和curl两个工程,而编译curl工程需要使用libcurl.lib文件,所以需要先编译libcurl工程。文件目录结构如下:

    需要配置对应的平台和版本,注意这里openssl编译要与libcurl的平台相匹配,否则会提示编译无法识别某些符号的错误。

    配置vs工程的三步曲,其实就是将deps文件下的路径添加进去:

1、配置包含文件目录:deps-include

2、配置库文件目录:deps-lib

3、配置附加依赖项

libssl_static.lib
libssl.lib
libcrypto_static.lib
libcrypto.lib

    编译工程,最后生成的下面两个文件就是我们最后需要的文件了:

2.4 检验

我们如何知道是否成功编译呢,就需要建立一个工程,跑下面这段代码去测试。将curl-7.71.1文件下的include文件夹整个拷贝,这个文件夹包含了curl和include(即openssl头文件),新建一个lib文件夹,将libcurl.dll和libcurl.lib放在一起。接下来就是包含文件和库文件、附加依赖项的添加,方法和上面一样。

附加依赖项选项:

ws2_32.lib
winmm.lib
wldap32.lib
libcurl.lib
jsoncpp.lib
libssl.lib
libcrypto.lib

 将libcurl.dll、libcrypto-3.dll、libssl-3.dll和jsoncpp.dll放到exe文件路径下,否则会提示找不到dll文件。

测试代码:

#include "../include/curl/curl.h"    
  
int main()
{
    CURL* curl;
    CURLcode res;
    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, true);
        curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com");
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        res = curl_easy_perform(curl);
        if (res != CURLE_OK)
        {
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
        }
        curl_easy_cleanup(curl);
    }
    system("pause");
    return 0;
}

这个程序是访问百度的,最后会打印出响应实体:

三、小结

    虽然上传已经编译好的文件或许能方便大家,但是确实没有这样的必要,很多问题都是需要根据实际情况去解决的,以前我也非常希望能拿别人现成的东西去用,但是最后的结果就是你没有锻炼到自己,产生了依赖别人的心理,对自己是非常不好的,心态崩溃多了,也就习惯了,也知道遇到问题应该怎么解决了。

    2020/07/24 编译的过程实在是繁琐,我今天重新从GitHub上面下载了openssl的库,发现编译出来的lib文件居然和我上次编译的文件不相同,结果在使用libcurl工程进行编译的时候出错了,如果有需要的评论留言给我吧,大家都知道CSDN资源下载的积分设定是非常不合理的,所以我就不上传到了。

猜你喜欢

转载自blog.csdn.net/qq_38609565/article/details/107491145