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

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

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

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

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

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

(1)給工程添加依賴庫:項(xiàng)目->屬性->鏈接器->輸入->附加依賴項(xiàng),ws2_32.lib;winmm.lib;wldap32.lib添加進(jìn)去。有時(shí)候“文檔管理程序——附加依賴項(xiàng)”這里改。注意要分號間隔
(2)檢查“屬性頁——C/C++——預(yù)處理器——預(yù)處理器定義”中是否有定義BUILDING_LIBCURL;CURL_STATICLIB;這兩個(gè)宏定義,當(dāng)然也可以在引用處代碼里面寫#define BUILDING_LIBCURL 之類的。注意,有的blog里面還提到了HTTP_ONLY這個(gè)宏定義,這是沒有編譯openssl的時(shí)候才需要定義
(3)新版本openssl中需要用Crypt32.lib這個(gè)庫,可以在屬性頁或頭文件里面引用

我的項(xiàng)目里面是用QT的pro文件來構(gòu)建解決方案,像windows的一些基礎(chǔ)依賴庫、宏定義和Crypt32.lib這個(gè)庫的引用,在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命令提示符工具(當(dāng)然可以為任意你安裝的開發(fā)環(huán)境命令行提示符工具)
  • (3)cd到zlib的根目錄,使用命令編譯
nmake -f win32/Makefile.msc OBJA="inffast.obj"

擴(kuò)展:編譯64位

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

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

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

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

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

此時(shí)在ms目錄下會(huì)生成nt.mak文件

  • (5)修改nt.make中的CFLAG 為 /MT,即靜態(tài)庫(動(dòng)態(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編譯選項(xiàng)為靜態(tài)庫MT(動(dòng)態(tài)庫MD)
(4)執(zhí)行nmake -f ms\nt.mak

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

3. 編譯libcurl
  • (1)zlib和openssl文件拷貝
    進(jìn)入libcurl目錄,projects\Windows\VC9目錄下新建一個(gè)文件夾例如:addfiles,并創(chuàng)建子目錄:include,lib,并將zlib.h拷貝至include目錄在include下新建子目錄openssl, 將openssl.lib依賴的頭文件全部拷貝至openssl目錄下;將zlib.lib, ssleay32.lib, libeay32.lib拷貝到addfiles\lib目錄下。
  • (2)編譯libcurl
    進(jìn)入libcurl的根目錄,然后進(jìn)入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庫會(huì)生成到對應(yīng)目錄,win64類似

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

1. 編譯zlib
  • (1)修改編譯選項(xiàng)
    優(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選項(xiàng),表示只編譯生成libcrypto.lib和libssl.lib,否則編譯完成后的測試會(huì)失敗。

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

注意:(1)命令nmake clean可以清理清除編譯Openssl-1.1.0f時(shí)產(chǎn)生的相關(guān)文件,不會(huì)清除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目錄下新建一個(gè)文件夾例如:addfiles,并創(chuàng)建子目錄:include,lib,將zlib.h拷貝至include目錄,在include下新建子目錄openssl, 將openssl.lib依賴的頭文件全部拷貝至openssl目錄下,將zlib.lib, 添加libcrypto.lib, libssl.lib拷貝到addfiles\lib目錄下。
  • (2)編譯
    進(jìn)入libcurl的根目錄,然后進(jìn)入projects\Windows\VC9目錄,直接用VS2008打開工程,在菜單欄選擇LIB Release - LIB OpenSSL,Win32,設(shè)置編譯選項(xiàng)如下:
在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、重點(diǎn)問題注意

(1)項(xiàng)目中調(diào)用openssl時(shí),必須添加一個(gè)密碼學(xué)庫:crypt32;

#pragma comment (lib, "crypt32")

原因:openssl庫使用了windows的一個(gè)密碼學(xué)庫: crypt32。否則報(bào)錯(cuò)

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 個(gè)無法解析的外部命令
1>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容