windows下libcurl+openssl靜態庫編譯(32位和64位靜態庫-不同openssl版本)
關於windows下編譯libcur相關的庫的文章是一大把,但是支援ssl的相關文章相對少一些,能按照對應要求編譯通過的更少,編譯成靜態庫的更少!再就是更不用說同事支援win64位系統的了,如下為我們開發過程中實際編譯通過的總結,一來希望後續使用人員能夠看到,為廣大網友做點實際的共享,二來作為備忘錄,以備後續自己使用,以防忘記或丟失。
libcur一來zlib和openssl,zlib庫編譯很簡單,不論是動態庫還是靜態庫,問題關鍵在於openssl這個庫動態庫和靜態庫的編譯。很多文章編譯openssl都使用的是openssl1.0.2o或一下,大多數網路文章也是給予這些老舊版本的openssl的編譯進行說明,但是現在官網最新的openssl都已經是openssl1.1.0h了,這個版本與openssl1.0.2o就不太一樣了,所以編譯方式也不一樣
注意,在專案使用libcurl過程中,我們遇到一個大坑,就是libcurl的多執行緒安全問題,由於用到https,即libcurl依賴openssl,如果不注意執行緒安全問題,會導致你的C++程式崩潰(我相信沒有人說我不用多執行緒處理應用的),這裡我要說明的重點是如何避免libcurl的https多執行緒問題:
(1)在post或get封裝(就是從libcurl請求到收到回覆整個過程的封裝)里加一把大鎖,鎖住與libcurl相關的所有https請求
(2)使用的libcurl支援ssl用到的openssl的版本必須在1.1.x或以上(已經解決執行緒安全問題)
(3)如果編譯的openssl版本在1.0.x以下,網路上還有一種處理方式就是設定一個回撥,具體參考網路文章
針對第一種,就是效率問題,如果加一把大鎖,我為何還用多執行緒處理http或https訊息,交給一個執行緒做就可以了,但是我們一般不會這麼幹;第二種就是我們今天要說明的問題,必須編譯openssl1.1.x以上依賴庫。
好了,不如正題,開始介紹兩個版本的openssl編譯和libcurl編譯:
一、靜態編譯(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靜態庫檔案。
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,在工程屬性中設定如下:
在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: 無法解析的外部符號 [email protected]
1>libcrypto.lib(e_capi.obj) : error LNK2001: 無法解析的外部符號 [email protected]
1>libcrypto.lib(e_capi.obj) : error LNK2001: 無法解析的外部符號 [email protected]
1>libcrypto.lib(e_capi.obj) : error LNK2001: 無法解析的外部符號 [email protected]
1>libcrypto.lib(e_capi.obj) : error LNK2001: 無法解析的外部符號 [email protected]
1>libcrypto.lib(e_capi.obj) : error LNK2001: 無法解析的外部符號 [email protected]
1>libcrypto.lib(e_capi.obj) : error LNK2001: 無法解析的外部符號 [email protected]
1>D:\code\opensslbaseapp\Release\PosCipherTest.exe : fatal error LNK1120: 7 個無法解析的外部命令
1>
相關推薦
windows下libcurl+openssl靜態庫編譯(32位和64位靜態庫-不同openssl版本)
關於windows下編譯libcur相關的庫的文章是一大把,但是支援ssl的相關文章相對少一些,能按照對應要求編譯通過的更少,編譯成靜態庫的更少!再就是更不用說同事支援win64位系統的了,如下為我們開發過程中實際編譯通過的總結,一來希望後續使用人員能夠看到,為廣大網友做點實
window10 vs2015下分別編譯libevent 32位和64位庫
Windows10 VS2015下分別編譯libevent 32位和64位庫 Libevnt 在Windows10 VS2015下分別編譯32位和64位庫 直接上王道libevent程式碼地址: https://github.com/libevent/libeve
Qt5.9.7 for ARM的編譯安裝(32位和64位)
Qt5.9.7 for ARM的編譯安裝 下載原始碼 前往http://download.qt.io/official_releases/qt/5.9/5.9.7/single/下載最新版的原始碼(我這裡下載的是當時最新的5.9.7)qt-everywhere-o
windows下安裝mysql5.6解壓版,32位和64位均可
對於32位和64位都是可以的。 1.複製mysql-5.6.14-win32.zip到D:\目錄下. 2.解壓mysql-5.6.14-win32.zip 3.在D:\mysql-5.6.14-win32下, 複製“my-default.ini”檔案,生成“復件 my-de
android工程如何編譯32位和64位庫
android.mk檔案中有LOCAL_MODULE_PATH的值比如為$(TARGET_OUT_SHARED_LIBRARIES)/hw的改為LOCAL_MODULE_RELATIVE_PATH := hw,後一種可以分別在lib和lib64下分別生成32位和64位的s
生成支援32位和64位靜態庫
我們在類UNIX平臺下,編譯32位或64位程式時,會分別使用對應的庫,32位或者64位庫(使用file命令檢視),下面說一下如何生成一個庫,支援32位和64位平臺。 以下是庫檔案:test_a.c #include <stdio.h>
C/C++中sizeof()的用法——32位和64位下的sizeof()
機器平臺:X86_64 處理器 作業系統:Red Hat 4.1.2-14 編譯器: gcc version 4.1.2 20070626 Size of char is: 1 Size of unsigned char is:
蘋果產品時間發布表統計(iPhone、iPad),以及32位和64位機的說明
bsp 產品 13.10 上市 pos min ipad mini 時間排序 手機 之前因為某些原因,需要對apple家族的手機和pad產品做一個上市時間排序,以及分析分別是哪種CPU機型 總結如下: iPad家族: 1、iPad - 2010.1.27發布 2、
32位/64位系統,jdk32位,64位,32/64位jdk編譯出來的class和eclipse 32位和64位
首先關於32位/64位系統,jdk32位,64位,32/64位jdk編譯出來的class和eclipse 32位和64位的一些對應關係做些說明。 1.32位作業系統不可以裝64位jdk,64位作業系統一般都可以安裝32位jdk,64位jdk是完美髮揮效能的。 2.64位eclipse只能在6
各種資料型別在16位、32位和64位系統下所佔位元組差異簡介
編寫C、C++程式時需要考慮每種資料型別在記憶體中所佔的記憶體大小,即使同一種資料型別在不同平臺下所佔記憶體大小亦不相同,具體對比如下: 資料型別 16位系統(byte) 32位系統(by
Java在win10系統下32位和64位環境變數設定
今天解決的一個問題終於把困擾我多年的環境變數之類的東西搞懂了。 這一切罪惡的根源就是win10的64位系統可以相容32位軟體 當我多年前安裝java的時候,我選擇了安裝32位版本的java而並非64位版本。我按照百度經驗的教程https://jingyan.baidu.c
(轉)32位和64位的區別
一.簡介 32位CPU:計算機中的位數指的是CPU一次能處理的最大位數。32位計算機的CPU一次最多能處理32位資料,例如它的EAX暫存器就是32位的,當然32位計算機通常也可以處理16位和8位資料。在Intel由16位的286升級到386的時候,為了和16位系統相容,它先
Linux32位和64位系統下配置JDK環境變數
以1.7版本為例,其他版本配置方法也一樣(要先確定是多少位的系統 -uname i 命令可以檢視)。 JDK 1.8 官網下載地址: JDK 1.8官網下載(Linux+Windows) 一.建立工作路徑 1.首先將下載好的jdk.tar.gz檔案拷貝到桌面上(Windows上下
C/C++32位和64位編譯器下,各資料型別和指標變數分配記憶體大小
1. 32位定址空間 資料型別 佔用位元組數(位元組) 說明 資料型別 佔用位元組數(位元組) 說明 Bool 1 char 1
MySQL5.7安裝教程(workbench安裝教程會在之後出)(32位和64位均可)
因為這學期的課程有資料庫和java,所以就去下載了MySQL。網上其實有很多其它的教程,但是我看了很多個教程說的其實有點亂,大概找了7個教程,然後才有了這個總結。雖然MySQL現在已經有了8.0的版本,但是網上相關的教程很少,並且我在幫老鄉安裝的過程中失敗了…所
MyEclipse *的安裝步驟和破解(32位和64位皆適用)(圖文詳解)
不多說,直接上乾貨! 簡單說下, MyEclipse自己會帶一個JDK,它是eclipse加外掛的增強版,就不用安裝eclipse了,JDK也可以不安裝了,但是推薦你安裝一個JDK,然後要在MyEclipse裡配置一下使用自己安裝的JDK,而不是MyE
Win8.1(64bit)+VS2012+OpenCV2.4.9(32位和64位)正確配置
opencv_calib3d249d.lib opencv_contrib249d.lib opencv_core249d.lib opencv_features2d249d.lib opencv_flann249d.lib opencv_gpu249d.lib opencv_highgui249d.lib
jdk百度雲下載(32位和64位)
連結:https://pan.baidu.com/s/1OhKjMVCCkALPA8rGBpMqkg 密碼:0qsl連結:https://pan.baidu.com/s/1Qu94kz390YobBxO0gEiP7Q 密碼:mkb6喜歡請關注,海量資源定期更新。Ps:本人是電
redis 在Windows下的安裝及基本操作(更新中~~~)
有用 redis 安裝 abc nbsp com inux eas pan 安裝目錄 Redis 安裝 Window 下安裝 下載地址:https://github.com/MSOpenTech/redis/releases。 Redis 支持 32 位和 64 位。這個需
Windows下swoole擴展的編譯安裝部署
php.ini cygwin .com 官網下載 -1 文件結尾 png -s 9.png 1. 到cygwin官網下載cygwin。 官網地址:https://www.cygwin.com/ 2. 打開下載好的cygwin安裝包,開始安裝cy