天天看點

Windows下Openssl1.0.0d安裝以及程式設計

必備條件:

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

繼續閱讀