1、编译环境
win10环境,64位,vs2013
2、使用环境
dll方式、兼容xp、32位
3、编译过程
3.1 编译openssl
3.1.1. 使用工具ActivePerl
http://www.activestate/activeperl/downloads
默认下一步安装就好,安装的最后,需要添加到PATH环境变量中,目的是在cmd.exe能直接运行。
测试是否安装成功,在cmd中,perl -version
C:\Users\Tenpo>perl -version
This is perl 5, version 26, subversion 3 (v5.26.3) built for MSWin32-x64-multi-thread
(with 2 registered patches, see perl -V for more detail)
Copyright 1987-2018, Larry Wall
Binary build 2603 [a95bce075] provided by ActiveState http://www.ActiveState
Built Dec 17 2018 09:46:45
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl/, the Perl Home Page.
如果不能运行,则可能是没有设置环境变量,手动添加至PATH中(右键我的电脑->属性->高级系统设置->高级->环境变量)
3.1.2 下载源码
http://www.openssl/source/ 下载 1.0.2e 这个版本修复了Heartbleed漏洞。(可以使用最新版本,但是否有风险未知)
3.1.3 编译
解压源码目录,cmd中进入到openssl源码路径(我的是D:\3rdpart\https\openssl-1.0.2e)下执行
perl Configure VC-WIN32 no-asm --prefix=D:\3rdpart\https\ssl_build
注意:D:\3rdpart\https\ssl_build是指生成物所在目录。VC-WIN32是32位平台,其他选项可参考{OPENSSL_SRC}/Configure文件中例子。
此时,在D:\3rdpart\https\openssl-1.0.2e目录下会生成Makefile文件。
继续如下执行
ms\do_ms.bat
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak test
nmake -f ms\ntdll.mak clean
nmake -f ms\ntdll.mak install
其中
// 可以测试有没有编译成功
nmake -f ms\ntdll.mak test
// 可以清理编译结果
nmake -f ms\ntdll.mak clean
// 编译结果保存到指定目录 D:\3rdpart\https\ssl_build
nmake -f ms\ntdll.mak install
如果执行成功,则在ssl_build目录下生成4个目录:bin、include、lib、ssl,分别存放exe(dll)、头文件、链接文件、配置文件.
注意:
此阶段,可能会遇到两个问题:
a、'nmake' 不是内部或外部命令,也不是可运行的程序或批处理文件。
解决方案:nmake是vc自带的make工具,可将nmake所在的目录加入到环境变量PATH中,我系统中所在位置为:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin.(设置后需要重新进入cmd)
b、ms\uplink.c(11) : fatal error C1083: 无法打开包括文件: “windows.h”: No such file or directory。
解决方案:cmd中执行 vcvars32,vcvars32是VC可执行目录下的一个批处理文件,作用是设置vc x86平台环境的,有兴趣的可以打开C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat仔细查看。
3.2 编译zlib
3.2.1. 官网下载最新版本zlib源代码
http://www.zlib/ zlib 1.2.8
http://zlib/zlib-1.2.8.tar.gz
3.2.2. 使用Visual Studio 2010 直接打开 zlib-1.2.8\contrib\vstudio\vc10\zlibvc.sln 运行即可。
或者在zlib根目录下 命令行执行
nmake -f win32/Makefile.msc
3.3 编译curl,最最坑的阶段
3.3.1. 官网下载libcurl源代码
http://curl.haxx.se/download.html 最新 Version 7.46.0
http://curl.haxx.se/download/curl-7.46.0.tar.bz2
b. 根据源代码根目录下winbuild目录下BUILD.WINDOWS.txt的提示
在源代码同级的目录下建立deps文件夹
此时的目录结构如下图
D:\3rdpart\https
|__curl-src
| |_winbuild
|
|__deps
|_ lib
|_ include
|_ bin
将D:\3rdpart\https\ssl_build\include下的openssl夹拷贝到D:\3rdpart\https\deps\include\目录下;
将zlib源码根目录下的zconf.h、zlib.h和zutil.h拷贝到D:\dev\vs\http\deps\include目录下。
将D:\3rdpart\https\ssl_build\lib目录下的libeay32.lib和ssleay.lib拷贝到D:\3rdpart\https\deps\lib目录下;
将zlib源码根目录下的zlib.lib拷贝到D:\3rdpart\https\deps\lib目录下。
c. 解压后
命令行进入源代码根目录下 winbuild 目录
nmake /f Makefile.vc mode=dll WITH_SSL=dll WITH_ZLIB=dll DEBUG=no
其他参数可以根据BUILD.WINDOWS.txt调整
生成文件在D:\3rdpart\https\curl-7.46.0\builds\下
如libcurl-vc-x86-debug-static-ssl-dll-zlib-dll-ipv6-sspi、libcurl-vc-x86-release-dll-ssl-dll-zlib-dll-ipv6等等。
注意:截止以上步骤,libcurl+ssl能在win7、win10等机器跑起来了,但但但是在xp上报错,继续
a、首先是弹出缺少normaliz.dll库提示,因为程序中加载的库的比较多,一下就懵逼了,不知道是哪个库导致的,可以在出现问题的机器上使用depends.exe查看加载库情况,发现就是libcurl.dll使用了这个库,网上找了一圈,有需要帖子都是针对静态库的编译进行源码级的修改,直接上手改libcurl的源码,如:
修改CURL_FOLDER\lib\idn_win32.c源码并重新编译。
参考链接:http://wwwblogs/passedbylove/p/5979927.html
但是我不想修改源码,猜想可能编译选项不对,于是去看BUILD.WINDOWS.txt的编译选项,发现ENABLE_IDN是个操作系统本地函数有关,于是试着将这个选项关掉(和操作系统无关性,毕竟如果libcurl在Linux上编译应该不会用这个库的),最终的编译方式是:
nmake /f Makefile.vc mode=dll WITH_SSL=dll WITH_ZLIB=dll DEBUG=no ENABLE_WINSSL=no ENABLE_IDN=no ENABLE_SSPI=no
b、继续试验,发现会弹出"无法定位程序输入点 InitializeCriticalSectionEx 于动态链接库 Kernel32.dll 上"
主要原因是win10+vs2013编译默认是不支持xp的,这时用depends.exe查看发现还是libcurl.dll调用这个函数,搜了一圈大多数都是libcurl在xp上使用遇到无法定位程序输入点GETTICKCOUNT64问题,个人感觉应该属于同一个问题,网上多数都是针对vs直接打开工程,修改工程文件的处理方式:
VS2013项目属性 -> 常规: 将平台工具集改为 "Visual Studio 2013 - Windows XP (v120_xp)
但是,那些都是在通过IDE直接修改的,在不用打开工程文件的情况下可以修改{src_curl}\winbuild\MakefileBuild.vc文件,修改方式将
CFLAGS = /I. /I ../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL
CURL_CFLAGS = /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c
CURL_LFLAGS = /nologo /out:$(DIRDIST)\bin\$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
改为
CFLAGS = /I. /I ../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL /D_USING_V110_SDK71_
CURL_CFLAGS = /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /D_USING_V110_SDK71_
CURL_LFLAGS = /nologo /out:$(DIRDIST)\bin\$(PROGRAM_NAME) /subsystem:console,"5.01" /machine:$(MACHINE)
对比IDE中,将平台工具集改为 "Visual Studio 2013 - Windows XP (v120_xp),会发现,/D_USING_V110_SDK71_ 和 /subsystem:console,"5.01" 对应将编译环境和链接环境分别进行了修改。
至此,踩坑完毕。网上静态库编译较多,特总结动态库编译方式。
参看:https://blog.csdn/amosfeng/article/details/78361663
https://wwwblogs/yan-shi-yi/p/5928844.html
https://blog.csdn/huangyimo/article/details/80337496
https://blog.csdn/ayang1986/article/details/50351742
更多推荐
win10环境编译支持xp的libcurl+openssl踩过的坑
发布评论