一、环境准备
- Visual Studio 2015(其他版本也可以)
- Git
- Perl
- CMake
二、开始编译
2.1 获取curl源码:
git clone --branch curl-7_60_0 https://github.com/curl/curl.git
2.2 获取openssl源码:
Git获取指定版本的源码,因为7_60_0
版本libcurl自带的build-openssl.bat
最高支持openssl 1.0.2版本,所以此处获取的OpenSSL_1_0_2o
分支的代码:
git clone --branch OpenSSL_1_0_2o https://github.com/openssl/openssl.git
2.3 编译openssl
cd curl/porjects
进入curl/porjects目录,执行如下命令开始编译openssl:
./build-openssl.bat vc14 x86 debug D:\\SourceCode\\openssl -perlpath C:\\Strawberry
# 命令中的C:\\Strawberry是Perl的安装目录
编译完的输出文件位于的openssl/build目录。
[可选] 修改openssl的运行时库
通过上面命令编译的openssl默认使用的是/MT
(debug版为/MTd
)的运行时库。如果需要更改为/MD
(或/MDd
),可以通过如下方式更改:
- 修改opessl源码目录中的
ms\nt.mak
文件(注:该文件由Perl脚本自动生成),将CFLAG
选项中的/MT
修改为/MD
。 - 因为
nt.mak
文件是由Configure命令生成的,所以我们需要屏蔽Configure步骤,否则会将我们上面的修改覆盖掉。具体方法为:注释掉build-openssl.bat
文件中对应得编译版本下的perl Configure debug-VC-WIN32 no-asm --prefix=%CD%
。
也可以到https://slproweb.com/products/Win32OpenSSL.html下载编译好的二进制文件。
2.4 编译curl
配置文件修改
编译curl之前,需要对curl\winbuild\MakefileBuild.vc
文件进行部分修改:
将DEVEL_LIB = $(WITH_DEVEL)/lib
行修改为:
!IF "$(DEBUG)"=="yes"
DEVEL_LIB = $(WITH_DEVEL)/lib/Debug
!ELSE
DEVEL_LIB = $(WITH_DEVEL)/lib/Release
!ENDIF
这样修改主要是为了在编译debug和release版本时,指定依赖库的debug/release版。
这一步是可选的。如果不修改,在编译debug和release版本时,分别拷贝不同版本的依赖库到lib目录即可。
拷贝依赖文件到deps
在curl
目录新建deps
目录(因为编译时指定了WITH_DEVEL=../deps
),并且在deps
目录中新建include
、lib/Debug
、lib/Release
目录,目录建完之后的结构如下:
拷贝openssl文件到deps中:
- 在deps\include中新建openssl目录,然后将
openssl\inc32
中的openssl目录(含该目录)拷贝到include\openssl中,即inlcude\openssl\openssl。 - 将
openssl\build\Win32\VC14\LIB Debug
中的*.lib
文件拷贝到lib/Debug
目录。
其他依赖库也可以使用此方法。
打开Visual Studio的命令行工具,进入到\curl\winbuild
目录,执行如下命令开始编译curl:
nmake /f Makefile.vc mode=static VC=15 MACHINE=x86 WITH_SSL=static DEBUG=yes WITH_DEVEL=../deps
编译完的输出文件位于curl\builds
目录。
[可选] 修改libcurl的运行时库
MakefileBuild.vc文件中针对static默认使用的是MT:
!IF "$(RTLIBCFG)"=="static"
RTLIB = /MT
RTLIB_DEBUG = /MTd
!ELSE
RTLIB = /MD
RTLIB_DEBUG = /MDd
!ENDIF
所以只需要在编译参数中加入RTLIBCFG=static
即可。
参考
curl\winbuild\BUILD.WINDOWS.txt