win10环境编译支持xp的libcurl+openssl踩过的坑

编程入门 行业动态 更新时间:2024-10-27 16:32:34

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踩过的坑

本文发布于:2023-06-14 02:30:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1428432.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:环境   xp   openssl   libcurl

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!