windows编译openssl+curl静态库

转载有截图的一步步照做的编译老版本openssl1.0.2p,先看下

较新的编译zlib/openssl/curl的方法,这个blog里面步骤很清晰,基本照着做就行了,注意
在libcurl属性页,Librarian / General /additional dependencies, 添加libcrypto.lib, libssl.lib, zlib.lib 这个地方,在VS2019中是“文档管理程序”,而不是“链接库”

快速找到一些网站:
perl下载地址
nasm下载地址
zlib下载地址
openssl下载地址
curl for win下载地址

遇到的一些问题:
1.编译curl时提示“无法打开输入文件libeay32.lib”等可能是因为curl工程中一些项目属性没有设置正确。比如我用VS2019打开curl-all.sln解决方案查看项目属性时,发现工程中附加依赖项中写了依赖这个库,但我编译生成的是openssl1.1.1,库名称改了,哈哈。所以可能需要手动修改“文档管理程序——附加依赖项”中的库名称,【注意不同库名称用分号间隔】
2.“无法打开输入文件libcurl.lib”,还是通过检查库依赖、附加包含目录完成,注意,不只是libcurl的属性页要改,包括curl的属性页也要改哈。
3.“无法解析的外部符号 __imp__ioctlsocket”一大堆错误,可能缺少windows的一些默认库
4.“无法解析的外部符号 _imp__curl”之类的跟curl相关的错误,是因为缺少设定的宏定义
5."无法解析的外部符号 __imp__CertOpenStore@20",等等,凡是跟crypt相关的,都是由于缺失Crypt32.lib

包括使用编译好的静态库时,也会有类似的错误
除了基础步骤,还有几个解决方案:

(1)给工程添加依赖库:项目->属性->链接器->输入->附加依赖项,ws2_32.lib;winmm.lib;wldap32.lib添加进去。有时候“文档管理程序——附加依赖项”这里改。注意要分号间隔
(2)检查“属性页——C/C++——预处理器——预处理器定义”中是否有定义BUILDING_LIBCURL;CURL_STATICLIB;这两个宏定义,当然也可以在引用处代码里面写#define BUILDING_LIBCURL 之类的。注意,有的blog里面还提到了HTTP_ONLY这个宏定义,这是没有编译openssl的时候才需要定义
(3)新版本openssl中需要用Crypt32.lib这个库,可以在属性页或头文件里面引用

我的项目里面是用QT的pro文件来构建解决方案,像windows的一些基础依赖库、宏定义和Crypt32.lib这个库的引用,在pro文件里面写都不好用。。。额


附转载内容,防止丢失:【 注意,这里的命令基本都是在VS命令工具里面执行哈】

一、静态编译(openssl1.0.2o)

1. 编译zlib
  • (1)优先把找到Makefile.msc的CFLAGS = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC)这一行,改为MD改为MT
  • (2)使用VS2008 的 Command Prompt命令提示符工具(当然可以为任意你安装的开发环境命令行提示符工具)
  • (3)cd到zlib的根目录,使用命令编译
nmake -f win32/Makefile.msc OBJA="inffast.obj"

扩展:编译64位

  • (1)进入“Visual Studio 2015 x64 兼容工具命令提示”
  • (2)在打开的vs 的x64环境命令中,进入zlib库,执行如下
contrib\masmx64\bld_ml64.bat

最终在zlib根目录生成对应头文件和lib静态库文件。但没有x64的目录,估计只能自己打开vs工程编译了

2. 编译openssl
  • (1)安装ActivePerl;
  • (2)使用VS2008 的 Command Prompt命令提示符工具,cd到openssl的根目录,依次执行
  • (3)执行如下命令
perl Configure VC-WIN32 no-asm 

这里说明:必须加no-asm,不然nmake报错:tmp32\sha1-586.asm(1427) : error A2070:invalid instruction operands

  • (4)执行如下命令
ms\do_ms.bat 

此时在ms目录下会生成nt.mak文件

  • (5)修改nt.make中的CFLAG 为 /MT,即静态库(动态为/MD)
  • (6) 执行如下指令
make -f ms\nt.mak

最终生成的库文件生成在openssl根目录的out32下。

【如果要继续编译,或重新编译64位的,则先做如下清理】

nmake -f ms\nt.mak clean

64静态库编译步骤
(1)执行perl Configure VC-WIN64A no-asm
(2)执行ms\do_win64a.bat
(3)修改ms\nt.mak编译选项为静态库MT(动态库MD)
(4)执行nmake -f ms\nt.mak

输出在out32下面(为了区别32bit输出,请先将32bit编译out32更改为其他名称,然后在编译64位,最后将编出来的out32改为out64。

3. 编译libcurl
  • (1)zlib和openssl文件拷贝
    进入libcurl目录,projects\Windows\VC9目录下新建一个文件夹例如:addfiles,并创建子目录:include,lib,并将zlib.h拷贝至include目录在include下新建子目录openssl, 将openssl.lib依赖的头文件全部拷贝至openssl目录下;将zlib.lib, ssleay32.lib, libeay32.lib拷贝到addfiles\lib目录下。
  • (2)编译libcurl
    进入libcurl的根目录,然后进入projects\Windows\VC9目录,直接用VS2008打开工程,在菜单栏选择LIB Release - LIB OpenSSL,Win32,在工程属性中设置如下:【在VS2019中是“文档管理程序”,而不是“链接库”】
在libcurl属性页,C/C++ / General /additional include Directories, 添加头文件目录..\addfiles\include
在libcurl属性页,Librarian / General /additional dependencies, 添加libeay32.lib, ssleay32.lib, zlib.lib
在libcurl属性页,Librarian / General /additional library Directories, 添加目录..\addfiles\lib
  • (3)编译libcurl

编译完libcurl,最终libcurl库会生成到对应目录,win64类似

二、静态编译(openssl1.1.0h)

1. 编译zlib
  • (1)修改编译选项
    优先把找到Makefile.msc的CFLAGS = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC)这一行,改为MD改为MT
  • (2)执行命令
    使用VS2008 的 Command Prompt命令提示符工具,cd到zlib的根目录,使用命令编译
nmake -f win32/Makefile.msc OBJA="inffast.obj" 
2. 编译openssl
  • (1)安装ActivePerl;
  • (2)静态编译
    使用VS2008 的 Command Prompt命令提示符工具,cd到openssl的根目录,依次执行:
perl Configure VC-WIN32  shared no-asm no-shared --prefix="C:/openssl_lib/win32-release" --openssldir="C:/openssl_lib/win32-release/ssl" 

注意:务必加入no-shared选项,表示只编译生成libcrypto.lib和libssl.lib,否则编译完成后的测试会失败。

  • (3)开始编译测试和安装
编译:nmake
测试:nmake test(查验全部测试成功)
安装:nmake install(编译好的文件将会出现在win32-release中)

注意:(1)命令nmake clean可以清理清除编译Openssl-1.1.0f时产生的相关文件,不会清除C:/openssl-1.1.0f/win32-release目录下编译好的Openssl

  • (2)64位编译需要设置为perl Configure VC-WIN64A 或 perl Configure debug-VC-WIN64A

  • (3)如果上一次编译完成,下一次编译需要清理上一次编译结果然后在重新编译,清理指令:nmake clean

3. 编译libcurl
  • (1)文件拷贝
    projects\Windows\VC9目录下新建一个文件夹例如:addfiles,并创建子目录:include,lib,将zlib.h拷贝至include目录,在include下新建子目录openssl, 将openssl.lib依赖的头文件全部拷贝至openssl目录下,将zlib.lib, 添加libcrypto.lib, libssl.lib拷贝到addfiles\lib目录下。
  • (2)编译
    进入libcurl的根目录,然后进入projects\Windows\VC9目录,直接用VS2008打开工程,在菜单栏选择LIB Release - LIB OpenSSL,Win32,设置编译选项如下:
在libcurl属性页,C/C++ / General /additional include Directories, 添加头文件目录..\addfiles\include
在libcurl属性页,Librarian / General /additional dependencies, 添加libcrypto.lib, libssl.lib, zlib.lib
在libcurl属性页,Librarian / General /additional library Directories, 添加目录..\addfiles\lib

最后编译生成libcurl静态库即可。

4、重点问题注意

(1)项目中调用openssl时,必须添加一个密码学库:crypt32;

#pragma comment (lib, "crypt32")

原因:openssl库使用了windows的一个密码学库: crypt32。否则报错

1>libcrypto.lib(e_capi.obj) : error LNK2001: 无法解析的外部符号 __imp__CertFreeCertificateContext@4
1>libcrypto.lib(e_capi.obj) : error LNK2001: 无法解析的外部符号 __imp__CertGetCertificateContextProperty@16
1>libcrypto.lib(e_capi.obj) : error LNK2001: 无法解析的外部符号 __imp__CertOpenStore@20
1>libcrypto.lib(e_capi.obj) : error LNK2001: 无法解析的外部符号 __imp__CertFindCertificateInStore@24
1>libcrypto.lib(e_capi.obj) : error LNK2001: 无法解析的外部符号 __imp__CertEnumCertificatesInStore@8
1>libcrypto.lib(e_capi.obj) : error LNK2001: 无法解析的外部符号 __imp__CertCloseStore@8
1>libcrypto.lib(e_capi.obj) : error LNK2001: 无法解析的外部符号 __imp__CertDuplicateCertificateContext@4
1>D:\code\opensslbaseapp\Release\PosCipherTest.exe : fatal error LNK1120: 7 个无法解析的外部命令
1>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350