最近用到openssl,以前從來沒用過,所以感覺特陌生,從下載安裝、到編譯通過,斷斷續續搞了兩天時間,網上關於openssl的文章也很多,但可能很難找到一篇能完全解決自己的問題的,最終也是東拼西湊才終於通過。所以趕緊整理一下,或許後來者也能悟出點道道來。openssl官網文檔也很全面...遇到問題特別建議先看看官網FAQ以及openssl目錄下的install.w32(install.w64)文件(直接拉到浏覽器)。
本文系統環境:Windows XP SP2+Visual Studio 2005+Perl 5.8.6+OpenSSL 0.9.8。
1、安裝Visual Studio 2005
如果安裝的是VC++60,實際在編譯OpenSSL時,總是會缺少某些文件,比如ml.exe,cl.exe....還有masm錯誤等,頭都大了,還等著要測試,沒時間一點點去試,直接換成Visual Studio 2005了。
2、安裝Perl
下載地址:http://www.activestate.com/ActivePerl
天緣安裝的ActivePerl-5.8.6.811-MSWin32-x86-122208.msi版本,太高版本沒用,以前做手機軟件時一直對這個版本傾愛有加。默認安裝目錄C:\Perl。
3、下載OpenSSL 0.9.8
下載地址:http://www.openssl.org/source/,版本不要太新(如果是做產品開發建議用最新的,前期測試所有軟件都可以用老一點的,會少一些兼容問題,新版本往往跨度較大,修改較多,多個軟件配合時自然很容易打架)。
如果只是使用OPENSSL,而且版本合適,可以嘗試人家編譯好了的,直接下載安裝即可:
http://www.openssl.org/related/binaries.html
1、解壓OpenSSL到系統盤
比如C:\OpenSSL。
2、配置WIN32環境
打開CMD命令行,進入C:\OpenSSL目錄,執行命令
perl Configure VC-WIN32
3、進入VC BIN目錄,配置VC環境變量
進入VS安裝路徑VC/Bin目錄下,運行:
VCVARS32.BAT
設置環境變量。
4、返回OpenSSL目錄,創建makefile文件
ms\do_ms
該命令不執行匯編語言編譯,如報告文末錯誤,可以嘗試ms\do_masm(使用匯編語言)、ms\do_nasm、ms\do_nt等,這幾個配置文件是針對不同的系統配置寫的批處理。
至於這幾個命令區別如下,其它的暫時沒用到未深究,有經驗之士歡迎賜教。
- If you are using MASM then run:
> ms\do_masm
- If you are using NASM then run:
> ms\do_nasm
- If you don't want to use the assembly language files at all then run:
> ms\do_ms
5、在Openssl目錄下,執行編譯
nmake -f ms\ntdll.mak
最終編譯動態庫完成後,輸出都在out32dll目錄下:包括可執行文件、兩個dll 和兩個lib文件: libeay32.dll, libeay32.lib, ssleay32.dll, ssleay32.lib,如果使用VS/VC編程只需按照下文的方法進行即可,如果需要使用openssl命令,還需要在系統環境變量path中增加c:\openssl\out32dll路徑,因為openssl.exe就在該目錄下,聲明後可以直接在命令行中使用openssl命令。
1、 配置包含文件
打開VS->Tools->Options->projects and solutions->VC++ Directories(VC6路徑VC->Tools->Options->Directories),在Include files中增加C:\openssl\inc32目錄,假設openssl安裝目錄為C:\openssl,下同。
在Libray files中增加C:\openssl\out32dll。
2、 包含頭文件,導入LIB庫
在源程序中包含以下三個頭文件並加入LIB:
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")
3、 更多OpenSSL編程參考:
1、不認識NMAKE?
解決辦法A:http://www.question-defense.com/2009/03/27/nmake-is-not-recognized-as-an-internal-or-external-command-operable-program-or-batch-file
解決辦法B:使用VS2005的控制台,開始菜單->Microsoft Visual Studio 2005->Visual Studio Tools->Visual Studio 2005 Command Prompt。NMAKE目錄實際在C:\Program Files\Microsoft Visual Studio 8\VC\bin下。
2、NMAKE編譯fatal error?
NMAKE : fatal error U1077: 'cl' : return code '0x2'
NMAKE : fatal error U1077: 'ml' : return code '0x1'
NMAKE : fatal error U1077: 'link' : return code '0x460'
遇到以上錯誤,請參考:http://www.flatws.cn/article/program/perl/2011-05-19/26439.html
3、NMAKE編譯遇到message Error?
如果遇到:
Message: 'The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _read. See online help for details.' NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\cl.EXE"' : return code '0x2'
Stop.
錯誤,打開ms\ntdll.mak,把CFLAG= /MD /W3 /WX....裡的/WX標志去掉。
4、_md5_block_asm_host_order編譯錯誤?
如果出現下面錯誤,可以嘗試使用ms\do_masm編譯命令。
link /nologo /subsystem:console /machine:I386 /opt:ref /dll /out:out32 dll\libeay32.dll /def:ms/LIBEAY32.def @C:\DOCUME~1\Test\LOCALS~1\Temp\nm58C.tmp ms/LIBEAY32.def(7) : warning LNK4017: DESCRIPTION statement not supported for the target platform; ignored
Creating library out32dll\libeay32.lib and object out32dll\libeay32.exp
md5_dgst.obj : error LNK2019: unresolved external symbol _md5_block_asm_host_order referenced in function _MD5_Update
out32dll\libeay32.dll : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\link.EXE"' : return code '0x460'
Stop.