因为工作原因要使用到百度的API,需要使用openssl和libcurl,刚开始以为这两个程序是分开来的,只需要分别添加到工程就可以,结果发现需要libcurl编译带openssl版本的库才可以,而且网上很多教程也是按照别人的程序进行编译,基本都是编译32位的,但是我要使用的是64位,过程还是蛮曲折的,但是也要感谢许多博文给予的一些启发,这篇博文即是一篇记录,也是分享经验。因为文中提及到的很多方法都是别的文章中提取出来的,文章太多也不好每一篇都附上链接。
编译的环境以及依赖:
1、visual studio 2019
2、openssl 1.1.1版本
3、curl-7.71.1版本
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
配置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
这是在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中。
关于新版,是按照下面这篇博文中的方法,编译成功,所以需要自行查看: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窗口会自动关闭。
这个操作成功,主要是参考了下面这篇博文:https://www.sindsun.com/articles/16/138。
我的方法有部分是参考博文的,也有我自己想出来的方法,这里记录一下我的操作。
将GitHub中的7.71.1版本源代码下载了之后,有一个文件是特别重要的,介绍了怎么用visual studio进行编译,博文中也提及了,curl-7.71.1/winbuild目录中,BUILD.WINDOWS.txt文档需要多阅读几遍。
project——Windows路径下存放的都是各个visual studio版本的sln工程文件,根据VC的版本号进行选择。我这里使用的vs2019也是使用VC15中的工程。
按照说明的方法,新建deps文件夹,将编译好的openssl文件放到了deps中,我构建的目录如下:
这些文件的位置:
deps下的目录结构:
bin文件中的内容:
lib文件中的内容:
openssl-master——include——openssl中的头文件所在文件夹
这里需要将include文件放到两个地方,放到后面那个地方是为了工程编译:
在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
编译工程,最后生成的下面两个文件就是我们最后需要的文件了:
我们如何知道是否成功编译呢,就需要建立一个工程,跑下面这段代码去测试。将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资源下载的积分设定是非常不合理的,所以我就不上传到了。