Windows平台下,编译Curl+OpenSSL

关键字

请勿转载,初级,编译,windows,curl,openssl,https,vs2017,nmake,dmake,1.1.0g,7.57.0,下载


前言

Curl本身并不直接支持https的,它需要额外提供一个OpenSSL来支持。在Windows平台下,大家都习惯了vs的IDE编译方式,但很遗憾,这里没办法完全使用IDE进行编译。本文采用vs2017与其他工具辅助编译x86版curl+openssl,Debug模式,最后输出一个exe用于测试。对于其他模式的编译可参照本文举一反三。

我认为,一篇编译教程,应该是友好的,能编译通过的,把坑填了的,没有废话的,环境可塑的。我以此目标尽力而为,失误和不足之处,还请大佬们多多指教。


准备工作

下载与安装,所下载均为发文时最新版本,本文所用资源均已打包到附件中提供下载(收费)。

 

ActivePerl (5.26.0.2600 x64)

https://www.activestate.com/activeperl/downloads

Nasm (2.13.02 x64)

http://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D

OpenSSL (1.1.0g)

https://www.openssl.org/source/

Curl (7.57.0)

https://curl.haxx.se/download.html

 

Nasm为可选项,这里推荐安装。安装Nasm后需要手工添加PATH环境变量。ActivePerl为必备项,安装后时会自动添加环境变量。二者的环境变量应确保有效,如若初次安装,推荐重启计算机以确保生效。对于编译器我采用vs2017,大家可根据自身情况选择。


开始编译

使用vs的cmd工具,在开始菜单中可以找到,vs2017是图中这个。我们编译的是x86版,x64的自己换。vs的专用控制台带有编译环境变量,所以不能直接使用系统自带的cmd。对于旧版vs没有这个工具,他提供的是一个名叫vcvars32.bat的批处理,在系统cmd中运行下就好。

英文:x86 Native ToolsCommand Prompt for VS 2017

中文:适用于 VS 2017 的 x86 本机工具命令提示


Windows平台下,编译Curl+OpenSSL_第1张图片


我们首先编译OpenSSL,从控制台中进入到代码根目录,我的目录如图所示:


Windows平台下,编译Curl+OpenSSL_第2张图片

对于本文使用的1.1.0g版,编译会用到五条指令,旧版OpenSSL所用指令并不相同,具体以实际为准:

perl Configure no-shared no-asm VC-WIN32 --debug --prefix=D:\Windows\OpenSSL --openssldir=D:\Windows\OpenSSL

nmake

nmake test

nmake install

nmake clean


perl是配置用,设置各种编译参数的地方。

no-shared表示编译lib,去掉就是编译dll。上面准备工作处,如果你没有安装Nasm,则需要no-asm这个参数,同理安装了的请去掉该参数。VC-WIN32可切换成VC-WIN64A。--debug去掉则为默认--release。--prefix和--openssldir用于输出,强烈建议设置。还有一些其他参数请参考代码根目录下的INSTALL文件。

四条nmake都是编译相关

nmake         编译

nmake test    编译后可以进行测试,但我们现在编译的是lib,没法测试,你要是可执行文件可以测试

nmake install  编译结果生成,这是最后一步

nmake clean    清理工作,排除各种疑难杂症,可多尝试先清理再编译


首先,配置参数,注意我这里是不带no-asm的,也就是需要Nasm

perl Configure no-shared VC-WIN32 --debug --prefix=D:\Windows\OpenSSL --openssldir=D:\Windows\OpenSSL


Windows平台下,编译Curl+OpenSSL_第3张图片


然后输入nmake开始编译,在我笔记本上五分钟就编译好了。如果你编译的时,卡壳某个文件上,如blake2s.c,千万不要作死关掉窗口,他真的只是慢而已。


Windows平台下,编译Curl+OpenSSL_第4张图片


编译完后是没有错误的。最后nmake install,就可以到上面配置的输出目录下找到编译结果了。


Windows平台下,编译Curl+OpenSSL_第5张图片


安装这里也不应有错误,我一帆风顺,你呢?你就不一定了。我们先把编译结果复制出来,结果在自己配置的输出路径下。


Windows平台下,编译Curl+OpenSSL_第6张图片


编译不过,这里有坑:

1,我们这里注意下ActivePerl的安装路径,此工具请安装在英文目录下,检查下看。实际上对于OpenSSL项目编译本身,我都建议在英文目录下进行,预防万一嘛。

2,ActivePerl进行配置时提示错误:

It looks like you don't have either nmake.exe or dmake.exe on your PATH,

so you will not be able to execute the commands from a Makefile.  You can

install dmake.exe with the Perl Package Manager by running:

 

    ppm install dmake


Windows平台下,编译Curl+OpenSSL_第7张图片

提示说得很清楚,但我明明有nmake,我也有手工添加PATH,为什么说他就没找到呢?你问我,我也不知道。我只能另下一个dmake来解决。提示中表示命令行:ppm install dmake可以下载dmake。嗯,显然这条对我也行不通,大家可以自行尝试。这里还提供一个下载链接:

http://code.activestate.com/ppm/dmake/

当然,你还有一个下载途径,就是本文的附件包中有提供dmake。

dmake,也需要手工设置根目录到PATH路径,与其他环境变量一样,你需要确保设置生效


接下来到Curl了。复制OpenSSL编译结果中的include文件夹复制到Curl的根目录下。include文件到到根目录。随后打开curl-all.sln。我打开的是:

\Curl\projects\Windows\VC14\src\curl-all.sln

vc版本自选,目前最高为14。在配置管理器中选择LIB Debug – LIB OpenSSL。选项很多,看清了别选错。调整libcurl项目的平台工具集支持xp。然后可以直接编译libcurl了。编译结果在:

\Curl\build\Win32\VC14\LIB Debug - LIB OpenSSL\libcurld.lib

注意本次编译的是Debug版,文件名末尾有一个d。

因为用的是vs的IDE编译,所以不会有什么坑,细心就好,十分方便。


Windows平台下,编译Curl+OpenSSL_第8张图片

最后测试

现在Curl与OpenSSL均以编译完成,我们需要进行测试了,测试代码就采用Curl提供的https代码进行吧。

\Curl\docs\examples\https.c

vs新建一个名为testhttps的空工程,并添加这个.c文件。当然,这个.c文件需要修改,修改后内容见下。复制三个lib到工程的.vcxproj(.vcproj)所在目录。一个是Curl的lib,两个是OpenSSL的lib,都是刚才编译的结果。还需要复制Curl的include\curl文件夹到此目录。

\Curl\include\curl\

\Curl\build\Win32\VC14\LIB Debug - LIB OpenSSL\libcurld.lib

\OpenSSL\lib\libcrypto.lib

\OpenSSL\lib\libssl.lib


Windows平台下,编译Curl+OpenSSL_第9张图片

我们再调整一下.c文件内容,以编译通过。测试结果如图,一切正常


Windows平台下,编译Curl+OpenSSL_第10张图片

调整代码:

//预编译定义
#define CURL_STATICLIB					//curl定义,表示我们当前使用的是lib,去掉表示当前使用dll
#define WIN32_LEAN_AND_MEAN				//系统定义,vs2017等新版编译器务必带上,否则xp平台工具集无法编译通过

#include 
#include "curl/curl.h"					//单书名号切换双引号以找到头文件

#pragma comment(lib, "libcurld.lib")	//刚才编译的三个lib
#pragma comment(lib, "libcrypto.lib")
#pragma comment(lib, "libssl.lib")

#pragma comment(lib, "ws2_32.lib")		//系统lib,Curl与OpenSSL的lib中会用到,缺一不可
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "Crypt32.lib")

#define SKIP_PEER_VERIFICATION			//跳过证书验证
#define SKIP_HOSTNAME_VERIFICATION		//跳过验证hostname

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
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
#endif

#ifdef SKIP_HOSTNAME_VERIFICATION
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
#endif

    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);
  }
  curl_global_cleanup();
  return 0;
}


以上。20171220,ucantseeme

 

附件下载(收费):

http://download.csdn.net/download/ucantseeme/10166974





你可能感兴趣的:(Windows平台下,编译Curl+OpenSSL)