必備條件:
1、安裝VC++ 6.0。
2、需要perl的支援,下載下傳ActivePerl并安裝: http://downloads.activestate.com/ActivePerl/releases/5.12.4.1205/ActivePerl-5.12.4.1205-MSWin32-x86-294981.msi
3、下載下傳 Openssl1.0.0d并解壓,當然是必不可少的。
http://www.openssl.org/source/openssl-1.0.0d.tar.gz
安裝步驟:
1、運作cmd,切換到openssl目錄,perl Configure VC-WIN32
如不成功會有明顯提示
2、下面三個指令選一個就行了
ms\do_ms 推薦使用這種方式 另外兩種方式 如果使用也必須保證本機有編譯器才能使用。
:ms\do_masm (預設vc 自帶的編譯器;也也以自己下載下傳安裝,我用的這個,因為我用其他的沒成)
:ms\do_nasm (需要自己下載下傳)
3、vcvars32.bat 以配置環境變量。
4、nmake -f ms\ntdll.mak 如果編譯成功,最後的輸出都在out32dll目錄下:包括可執行檔案、兩個dll和兩個lib檔案: libeay32.dll, libeay32.lib, ssleay32.dll, ssleay32.lib(我編譯的時候出現了這個錯誤
'ml' 不是内部或外部指令,也不是可運作的程式
或批處理檔案。
NMAKE : fatal error U1077: 'ml' : return code '0x1'
Stop.
大家應該一看就知道問題所在,解決很容易,把VC下的ml.exe複制到目前目錄即可。但是有些人安裝VC後沒有ml.exe,這個也好解決,下載下傳一個MASM8.0,我下載下傳下來名字是MASMsetup.exe,不用安裝,按下面來:
1、用winrar解壓安裝檔案MASMsetup.EXE,得到Setup.exe
2、用winrar解壓Setup.exe,得到vc_masm1.cab
3、用winrar解壓vc_masm1.cab,得到一個檔案,檔案名很長,改名為ml.exe就行了。
再次編譯,可能還會出現如下錯誤:
fatal error LNK1103: debugging information corrupt; recompile module
openssl link return code 0x44f
這個錯誤産生的原因是:
随着VC7/VC8中新的debug資訊格式和一些安全檢查機制的導入,在VC6上使用這些庫的Debug版本的時候
就會産生如題的連結錯誤。具體而言,你可能在VC6上使用了XP SP2,Windows 2003或者Windows 2003 R2
版本的SDK。
解決辦法:
1.用Release版編譯,不過這樣就沒法調試了。
打開ntdll.mak,找到這一行
LFLAGS=/nologo /subsystem:console /opt:ref /debug
修改最後的debug為release(我就是采用這個方法)
2.到Tool -> Options -> Directories(以VC6.0為例),将SDK的順序放到最下邊或者直接删掉較新SDK
的Directories:包括Include files和Library files。(我試過,好像不行)
3.如果你必須使用SDK中的新特性,那麼找一個2004年之前的SDK吧。
這裡是最後一版支援VC6的SDK的下載下傳位址:
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm
4.友善的話,幹脆遷移到VC7/VC8。
應該就沒有什麼問題了。
程式設計初步:
1、 打開VC-Tools-Options-Directores,在Include files中增加【Openssl1.0.0d】\inc32目錄;在Libray files中增加【Openssl1.0.0d】\out32dll
2、 在源程式中包含以下三個頭檔案并加入LIB:
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")
以上是最簡單的安裝方式,但是不能使用靜态庫,生成的程式必須帶着DLL檔案才行,下面有另外一種安裝方式:
将源碼釋放在c:\Openssl1.0.0d目錄中。
進入openssl源碼目錄。
cd c:\Openssl1.0.0d
以下為參照該目錄下的檔案INSTALL.W32的執行過程:
運作configure:
perl Configure VC-WIN32 --prefix=c:/openssl
建立Makefile檔案:
ms\do_ms
清除上次靜态庫的編譯,以便重新編譯:
nmake -f ms\nt.mak clean
編譯靜态庫:
nmake -f ms\nt.mak(上面是ntdll.mak,同樣修改debug為release)
使用靜态庫,隻需在Libray files中修改【c:\Openssl1.0.0d】\out32dll 為【c:\Openssl1.0.0d】\out32
我遇到的一個問題,到網上找到了答案,記錄如下:
--------------------Configuration: b64 - Win32 Release--------------------
Compiling...
b64.c
Linking...
MSVCRT.lib(MSVCRT.dll) : error LNK2005: __isctype already defined in LIBCMT.lib(isctype.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _fclose already defined in LIBCMT.lib(fclose.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: __errno already defined in LIBCMT.lib(dosmap.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _fflush already defined in LIBCMT.lib(fflush.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _strncpy already defined in LIBCMT.lib(strncpy.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in LIBCMT.lib(strchr.obj)
LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFAULTLIB:library
Release/b64.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.
b64.exe - 7 error(s), 1 warning(s)
從錯誤資訊可以看出是msvcrt.lib和libcmt.lib庫中重複定義了__isctype等符号。為什麼會出現這樣的問題呢?這就要從這兩個庫的作用說起了。
msvcrt.lib是VC中的Multithreaded DLL 版本的C運作時庫,而libcmt.lib是Multithreaded的運作時庫。在同一個項目中,所有的源檔案必須連結相同的C運作時庫。如果某一檔案用了Multithreaded DLL版本,而其他檔案用了Single-Threaded或者Multithreaded版本的庫,也就是說用了不同的庫,就會導緻這個警告的出現。
告警資訊的意思我們明白之後,就要找造成這個問題的原因了。在項目設定中我們可以看到目前項目使用的是Multithreaded非DLL版本的運作時庫,這說明項目中還有其他檔案用到了不是這個版本的運作時庫。很顯然,就是openssl的靜态庫。檢視openssl中ms下的nt.mak,我們可以發現靜态庫版本中openssl使用編譯開關/MD進行編譯的,也就是說openssl靜态庫是預設用的Multithreaded DLL 版本的C運作時庫。
原因找到了。那麼解決方法,很明顯有兩個。總之就是将兩個項目的運作時庫統一。
簡單的方式就是将項目的動态庫修改為使用Multithreaded DLL 版本的C運作時庫即可。某些情況下你的項目可能不能改變目前的運作時庫,你可以将openssl的nt.mak中的/MD開關修改為/MT然後重新編譯openssl靜态庫就可以了。
VC中的C運作時庫一共有6種,想了解更多資訊可以參閱我先前翻譯的文章。
Single-threaded (libc.lib)libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.libMultithreaded (libcmt.lib)libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.libMultithreaded using DLL (msvcrt.lib)libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.libDebug Single-threaded (libcd.lib)libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.libDebug Multithreaded (libcmtd.lib)libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.libDebug Multithreaded using DLL (msvcrtd.lib)libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib
現在發現修改為Release後,VC隻能編譯Release版本,暫時還是使用openssl-0.9.8r
清除上次動态庫的編譯,以便重新編譯:
nmake -f ms\ntdll.mak clean