关键字
请勿转载,初级,编译,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 本机工具命令提示
我们首先编译OpenSSL,从控制台中进入到代码根目录,我的目录如图所示:
对于本文使用的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
然后输入nmake开始编译,在我笔记本上五分钟就编译好了。如果你编译的时,卡壳某个文件上,如blake2s.c,千万不要作死关掉窗口,他真的只是慢而已。
编译完后是没有错误的。最后nmake install,就可以到上面配置的输出目录下找到编译结果了。
安装这里也不应有错误,我一帆风顺,你呢?你就不一定了。我们先把编译结果复制出来,结果在自己配置的输出路径下。
编译不过,这里有坑:
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
提示说得很清楚,但我明明有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编译,所以不会有什么坑,细心就好,十分方便。
最后测试
现在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
我们再调整一下.c文件内容,以编译通过。测试结果如图,一切正常
//预编译定义
#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