windows編譯openssl+curl靜態(tài)庫

轉(zhuǎn)載有截圖的一步步照做的編譯老版本openssl1.0.2p猜惋,先看下

較新的編譯zlib/openssl/curl的方法隆圆,這個blog里面步驟很清晰伪货,基本照著做就行了威鹿,注意
在libcurl屬性頁乞娄,Librarian / General /additional dependencies, 添加libcrypto.lib, libssl.lib, zlib.lib 這個地方瞬逊,在VS2019中是“文檔管理程序”,而不是“鏈接庫”

快速找到一些網(wǎng)站:
perl下載地址
nasm下載地址
zlib下載地址
openssl下載地址
curl for win下載地址

遇到的一些問題:
1.編譯curl時提示“無法打開輸入文件libeay32.lib”等可能是因為curl工程中一些項目屬性沒有設(shè)置正確仪或。比如我用VS2019打開curl-all.sln解決方案查看項目屬性時确镊,發(fā)現(xiàn)工程中附加依賴項中寫了依賴這個庫,但我編譯生成的是openssl1.1.1,庫名稱改了范删,哈哈蕾域。所以可能需要手動修改“文檔管理程序——附加依賴項”中的庫名稱,【注意不同庫名稱用分號間隔】
2.“無法打開輸入文件libcurl.lib”到旦,還是通過檢查庫依賴旨巷、附加包含目錄完成,注意添忘,不只是libcurl的屬性頁要改采呐,包括curl的屬性頁也要改哈。
3.“無法解析的外部符號 __imp__ioctlsocket”一大堆錯誤搁骑,可能缺少windows的一些默認庫
4.“無法解析的外部符號 _imp__curl”之類的跟curl相關(guān)的錯誤斧吐,是因為缺少設(shè)定的宏定義
5."無法解析的外部符號 __imp__CertOpenStore@20",等等,凡是跟crypt相關(guān)的仲器,都是由于缺失Crypt32.lib

包括使用編譯好的靜態(tài)庫時煤率,也會有類似的錯誤
除了基礎(chǔ)步驟,還有幾個解決方案:

(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文件來構(gòu)建解決方案,像windows的一些基礎(chǔ)依賴庫鹃彻、宏定義和Crypt32.lib這個庫的引用郊闯,在pro文件里面寫都不好用。。团赁。額


附轉(zhuǎn)載內(nèi)容育拨,防止丟失:【 注意,這里的命令基本都是在VS命令工具里面執(zhí)行哈】

一欢摄、靜態(tài)編譯(openssl1.0.2o)

1. 編譯zlib
  • (1)優(yōu)先把找到Makefile.msc的CFLAGS = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC)這一行熬丧,改為MD改為MT
  • (2)使用VS2008 的 Command Prompt命令提示符工具(當然可以為任意你安裝的開發(fā)環(huán)境命令行提示符工具)
  • (3)cd到zlib的根目錄,使用命令編譯
nmake -f win32/Makefile.msc OBJA="inffast.obj"

擴展:編譯64位

  • (1)進入“Visual Studio 2015 x64 兼容工具命令提示”
  • (2)在打開的vs 的x64環(huán)境命令中怀挠,進入zlib庫析蝴,執(zhí)行如下
contrib\masmx64\bld_ml64.bat

最終在zlib根目錄生成對應頭文件和lib靜態(tài)庫文件。但沒有x64的目錄绿淋,估計只能自己打開vs工程編譯了

2. 編譯openssl
  • (1)安裝ActivePerl;
  • (2)使用VS2008 的 Command Prompt命令提示符工具闷畸,cd到openssl的根目錄,依次執(zhí)行
  • (3)執(zhí)行如下命令
perl Configure VC-WIN32 no-asm 

這里說明:必須加no-asm吞滞,不然nmake報錯:tmp32\sha1-586.asm(1427) : error A2070:invalid instruction operands

  • (4)執(zhí)行如下命令
ms\do_ms.bat 

此時在ms目錄下會生成nt.mak文件

  • (5)修改nt.make中的CFLAG 為 /MT佑菩,即靜態(tài)庫(動態(tài)為/MD)
  • (6) 執(zhí)行如下指令
make -f ms\nt.mak

最終生成的庫文件生成在openssl根目錄的out32下。

【如果要繼續(xù)編譯裁赠,或重新編譯64位的殿漠,則先做如下清理】

nmake -f ms\nt.mak clean

64靜態(tài)庫編譯步驟
(1)執(zhí)行perl Configure VC-WIN64A no-asm
(2)執(zhí)行ms\do_win64a.bat
(3)修改ms\nt.mak編譯選項為靜態(tài)庫MT(動態(tài)庫MD)
(4)執(zhí)行nmake -f ms\nt.mak

輸出在out32下面(為了區(qū)別32bit輸出,請先將32bit編譯out32更改為其他名稱佩捞,然后在編譯64位绞幌,最后將編出來的out32改為out64。

3. 編譯libcurl
  • (1)zlib和openssl文件拷貝
    進入libcurl目錄失尖,projects\Windows\VC9目錄下新建一個文件夾例如:addfiles啊奄,并創(chuàng)建子目錄: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,在工程屬性中設(shè)置如下:【在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類似

二、靜態(tài)編譯(openssl1.1.0h)

1. 編譯zlib
  • (1)修改編譯選項
    優(yōu)先把找到Makefile.msc的CFLAGS = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC)這一行纱注,改為MD改為MT
  • (2)執(zhí)行命令
    使用VS2008 的 Command Prompt命令提示符工具畏浆,cd到zlib的根目錄,使用命令編譯
nmake -f win32/Makefile.msc OBJA="inffast.obj" 
2. 編譯openssl
  • (1)安裝ActivePerl;
  • (2)靜態(tài)編譯
    使用VS2008 的 Command Prompt命令提示符工具狞贱,cd到openssl的根目錄刻获,依次執(zhí)行:
perl Configure VC-WIN32  shared no-asm no-shared --prefix="C:/openssl_lib/win32-release" --openssldir="C:/openssl_lib/win32-release/ssl" 

注意:務(wù)必加入no-shared選項,表示只編譯生成libcrypto.lib和libssl.lib瞎嬉,否則編譯完成后的測試會失敗蝎毡。

  • (3)開始編譯測試和安裝
編譯:nmake
測試:nmake test(查驗全部測試成功)
安裝:nmake install(編譯好的文件將會出現(xiàn)在win32-release中)

注意:(1)命令nmake clean可以清理清除編譯Openssl-1.1.0f時產(chǎn)生的相關(guān)文件,不會清除C:/openssl-1.1.0f/win32-release目錄下編譯好的Openssl

  • (2)64位編譯需要設(shè)置為perl Configure VC-WIN64A 或 perl Configure debug-VC-WIN64A

  • (3)如果上一次編譯完成氧枣,下一次編譯需要清理上一次編譯結(jié)果然后在重新編譯沐兵,清理指令:nmake clean

3. 編譯libcurl
  • (1)文件拷貝
    projects\Windows\VC9目錄下新建一個文件夾例如:addfiles,并創(chuàng)建子目錄: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螟左,設(shè)置編譯選項如下:
在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靜態(tài)庫即可巷嚣。

4、重點問題注意

(1)項目中調(diào)用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>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市红且,隨后出現(xiàn)的幾起案子坝茎,更是在濱河造成了極大的恐慌,老刑警劉巖暇番,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗤放,死亡現(xiàn)場離奇詭異,居然都是意外死亡壁酬,警方通過查閱死者的電腦和手機次酌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門恨课,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人和措,你說我怎么就攤上這事庄呈。” “怎么了派阱?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵诬留,是天一觀的道長。 經(jīng)常有香客問我贫母,道長文兑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任腺劣,我火速辦了婚禮绿贞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘橘原。我一直安慰自己籍铁,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布趾断。 她就那樣靜靜地躺著拒名,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芋酌。 梳的紋絲不亂的頭發(fā)上增显,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音脐帝,去河邊找鬼同云。 笑死,一個胖子當著我的面吹牛堵腹,可吹牛的內(nèi)容都是我干的炸站。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼疚顷,長吁一口氣:“原來是場噩夢啊……” “哼武契!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荡含,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤释液,失蹤者是張志新(化名)和其女友劉穎装处,沒想到半個月后浸船,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寝蹈,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡箫老,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阔籽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牲蜀。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖在辆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情度苔,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布奕删,位于F島的核電站疗认,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谨设。R本人自食惡果不足惜缎浇,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一素跺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧指厌,春花似錦、人聲如沸踩验。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钠龙。三九已至,卻和暖如春俊鱼,著一層夾襖步出監(jiān)牢的瞬間并闲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工溜徙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留犀填,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像冕广,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沟优,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345