1、編譯OpenSSLhtml
在編譯OpenSSL前,須要正確安裝Perl,由於在編譯OpenSSL時須要使用到該程序。
下載最新版本的Perl:http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.822-MSWin32-x86-280952.zip。而後安裝之。多線程
下載最新版本的OpenSSL:http://www.openssl.org/source/openssl-0.9.8g.tar.gz
而後將源碼釋放的c:\openssl-0.9.8g目錄中。
進入openssl源碼目錄。
cd c:\openssl-0.9.8.g
如下爲參照該目錄下的文件INSTALL.W32的執行過程:函數
運行configure:
perl Configure VC-WIN32 --prefix=c:/openssl測試
建立Makefile文件:
ms\do_ms
編譯動態庫:
nmake -f ms\ntdll.mak
編譯靜態庫:
nmake -f ms\nt.mak線程
測試動態庫:
nmake -f ms\ntdll.mak test
測試靜態庫:
nmake -f ms\nt.mak testhtm
安裝動態庫:
nmake -f ms\ntdll.mak install
安裝靜態庫:
nmake -f ms\nt.mak installblog
清除上次動態庫的編譯,以便從新編譯:
nmake -f ms\ntdll.mak clean
清除上次靜態庫的編譯,以便從新編譯:
nmake -f ms\nt.mak cleanip
2、使用OpenSSLssl
在VC中配置使用以上的函數庫:
點擊菜單:Tools -> Options,彈出對話框"Options",在該對話框中選擇"Directories"標籤。
在"Show directories for:"的"Include files"選項中新增目錄"C:\openssl\include";"Library files"選擇中新增目錄"C:\openssl\lib"。
而後在須要連接OpenSSL函數庫的工程中編譯時加入"libeay32.lib"就能夠了。源碼
3、問題
我在連接OpenSSL的靜態函數庫時遇到相似如下的問題:
Linking...
msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmtd.lib(strchr.obj)
...
這是因爲OpenSSL的靜態函數庫使用的是了VC的多線程DLL的Release版本,而個人程序使用了多線程靜態連接的Release版本。
調整OpenSSL的靜態函數庫使用的庫函數版本便可,調整過程以下:
編輯文件 ms\nt.mak,將該文件第19行
"CFLAG= /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE /Fdout32 -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_TLSEXT -DOPENSSL_NO_KRB5 -DOPENSSL_NO_DYNAMIC_ENGINE"
中的"/MD"修改成"/MT"。而後從新編譯安裝OpenSSL便可。
4、附錄:在VC中對C/C++ 運行時庫不一樣版本編譯指令說明 《在VC中對C/C++ 運行時庫不一樣版本編譯指令說明》(http://blog.yesky.com/271/dgkang/1737771.shtml)一文中詳細介紹了鏈接不一樣版本庫的編譯指令以下: C Runtime Library: /MD MSVCRT.LIB 多線程DLL的Release版本 /MDd MSVCRTD.LIB 多線程DLL的Debug版本 /MT LIBCMT.LIB 多線程靜態連接的Release版本 /MTd LIBCMTD.LIB 多線程靜態連接的Debug版本 /clr MSVCMRT.LIB 託管代碼和非託管代碼混合 /clr:pure MSVCURT.LIB 純託管代碼 C++ Standard Library: /MD MSVCPRT.LIB 多線程DLL的Release版本 /MDd MSVCPRTD.LIB 多線程DLL的Debug版本 /MT LIBCPMT.LIB 多線程靜態連接的Release版本 /MTd LIBCPMTD.LIB 多線程靜態連接的Debug版本