Windows编译curl和openssl

1、安装ActivePerl(下载地址

2、安装nasm(下载地址

3、下载openssl的源代码(下载地址

4、下载curl的源代码(下载地址

5、将以下脚本内容另存为bat文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
set SOURCE_PATH=D:\projects\openssl-1.1.1b
set PREFIX=D:\projects\openssl-x64
set BUILD_CONFIG=VC-WIN64A
set INSTALL_VCENV="D:\Program\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvars64.bat"

where /q perl
IF ERRORLEVEL 1 (
ECHO Perl cannot be found. Please ensure it is installed and placed in your PATH.
PAUSE
EXIT /B
)

where /q nasm
IF ERRORLEVEL 1 (
ECHO nasm cannot be found. Please ensure it is installed and placed in your PATH.
PAUSE
EXIT /B
)

CD /D %SOURCE_PATH%
CALL %INSTALL_VCENV%
perl Configure %BUILD_CONFIG% no-shared --prefix=%PREFIX%
nmake
nmake test
nmake install

详细可参考openssl源代码目录下INSTALL中的Configuration Options

6、按实际情况修改SOURCE_PATH/PREFIX/BUILD_CONFIG/INSTALL_VCENV四个变量的值,其中:
SOURCE_PATH:openssl的源代码所在目录
PREFIX:编译openssl生成的文件存放的目录
BUILD_CONFIG:编译配置,有以下选项可选:VC-WIN64A/debug-VC-WIN64A/debug-VC-WIN32/VC-WIN32
INSTALL_VCENV:VS的64位编译环境配置bat文件路径(如果是编译32位,则需改为vcvars32.bat

7、执行该bat,待编译完成后,在PREFIX指定的目录中可找到生成的文件列表。
VC-WIN64A(64位release)为例,编译完成后在生成文件目录下的lib目录中可找到相应的lib文件(这里是D:\projects\openssl-x64\lib),dll文件则可在bin目录中找到(这里是D:\projects\openssl-x64\bin

8、根据curl源代码目录下的winbuild/BUILD.WINDOWS.txt文件描述,将openssl生成的文件转移到curl源代码目录上一层下的deps中:
somedirectory\
|_curl-src
| |_winbuild
|
|deps
|
lib
| include
|
bin

9、打开VS的本机工具命令提示(以VS2017为例,x86为x86 Native Tools Command Prompt for VS 2017,x64为x64 Native Tools Command Prompt for VS 2017),之后切换到libcurl源代码目录下的winbuild目录,以D:\projects\curl-7.64.0为例:

1
CD /D D:\projects\curl-7.64.0\winbuild

10、根据winbuild/BUILD.WINDOWS.txt文件描述,执行nmake命令。以编译64位静态库为例:

1
nmake /f Makefile.vc mode=static VC=15 WITH_SSL=static MACHINE=x64 DEBUG=no

执行完成后,在curl源代码目录下的builds\libcurl-vc15-x64-release-static-ssl-static-ipv6-sspi目录中可以找到生成的文件列表。

11、新建一个控制台项目用于测试,测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;
#include <windows.h>
#include "curl/curl.h"

int main()
{
CURL *pCurl;
pCurl = curl_easy_init();
if (pCurl == nullptr)
{
cout << "curl_easy_init FAIL!" << endl;
return 0;
}

curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, true);
curl_easy_setopt(pCurl, CURLOPT_URL, "https://cn.bing.com");
curl_easy_setopt(pCurl, CURLOPT_FOLLOWLOCATION, 1L);

CURLcode nCode = curl_easy_perform(pCurl);
if (nCode != CURLE_OK)
{
cout << "curl_easy_perform FAIL! errstr=" << curl_easy_strerror(nCode) << endl;
}
curl_easy_cleanup(pCurl);

return 0;
}

12、项目配置修改:

  • 添加curl生成文件目录下的include目录到测试项目的附加包含目录(D:\projects\curl-7.64.0\builds\libcurl-vc15-x64-release-static-ssl-static-ipv6-sspi\include

  • 添加curl生成文件目录下的lib目录(D:\projects\curl-7.64.0\builds\libcurl-vc15-x64-release-static-ssl-static-ipv6-sspi\lib)和openssl生成文件目录下的lib目录(D:\projects\openssl-x64\lib)到测试项目的附加库目录

  • 修改附加依赖项,添加以下lib文件:wldap32.lib;libcrypto.lib;libssl.lib;libcurl_a.lib;Normaliz.lib;ws2_32.lib;crypt32.lib;
  • 预处理器添加CURL_STATICLIB

13、编译项目并运行,能打印出网页源代码则说明测试成功。

参考:

文章目录