轉(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>