1. 程式人生 > >64位Win7下用VS2010編譯OpenSSL

64位Win7下用VS2010編譯OpenSSL

首先要說明,如果不想自己編譯OpenSSL,可以到
http://slproweb.com/products/Win32OpenSSL.html
去下載安裝已經編譯好的檔案。

使用到的軟體:
1) 64位Win7 sp1專業版
2) Perl,當時用的是ActivePerl 5.14.2.102(64位版),安裝目錄在 E:\Perl64\
3) OpenSSL 1.0.1c  解壓後文件放在目錄 F:\openssl\  該目錄下應該有apps,bugs,certs等子目錄和其他一些檔案。注意下載OpenSSL以後解壓縮最好把檔案放在英文路徑下,路徑中最好不要有非英文字元、空格等特殊符號。
4) Visual Studio 2010,安裝目錄在 E:\Microsoft Visual Studio 10.0\

這裡要編譯出64位的庫檔案,所以應該先仔細閱讀openssl目錄下的INSTALL.W64檔案。如果需要編譯出32位的庫檔案,應該閱讀openssl目錄下的INSTALL.W32檔案。

檢查perl相關檔案是否被新增到環境變數,在命令列視窗中執行Path,結果應該為:PATH=E:\Perl64\site\bin;E:\Perl64\bin; ...

啟動VS2010命令列視窗,在“開始”選單 Visual Studio 2010 中選擇Visual Studio Tools,在其中選擇Visual Studio x64 Win64命令提示(2010),注意不要選擇Visual Studio x64 Win64相容工具命令提示(2010),也不要選擇Visual Studio IDE裡面“工具”選單中的"Visual Studio命令提示",進入那個命令視窗以後使用的預設編譯器是32位而不是64位編譯器。也可以在命令列視窗中,進入目錄 E:\Microsoft Visual Studio 10.0\vc\bin\amd64\ ,執行命令 vcvar64.bat。

 (如果想要編譯出32位的庫檔案,在“開始”選單 Visual Studio 2010 中選擇Visual Studio Tools,在其中選擇Visual Studio 命令提示(2010)。或者在命令列視窗中,進入目錄 E:\Microsoft Visual Studio 10.0\VC\bin\ ,執行vcvars32.bat。)


進入Openssl檔案所在目錄 F:\openssl\ ,執行下面的命令:
perl Configure VC-WIN64A
ms\do_win64a
nmake -f ms\ntdll.mak
nmake -f ms\nt.mak

注意:

1)  nmake -f ms\ntdll.mak命令生成動態連結庫,輸出內容在\openssl\out32dll目錄下。

     nmake -f ms\nt.mak命令生成靜態連結庫,輸出內容在\openssl\out32目錄下。 

2) 如果要編譯出32位的庫,執行的命令有所不同,用不到彙編時應該使用下面的命令:

perl Configure VC-WIN32 no-asm

ms\do_ms

nmake -f ms\ntdll.mak
nmake -f ms\nt.mak

    如果用到彙編,並且使用NASM(官網是:http://www.nasm.us/),應該執行下面的命令

perl Configure VC-WIN32

ms\do_nasm

nmake -f ms\ntdll.mak
nmake -f ms\nt.mak

3) perl Configure VC-WIN64A 命令中 Configure這個字串中的字母大小寫一個也不能錯!否則後面編譯會出問題。

4) 可以使用--prefix=...來指定openssl編譯好以後的安裝路徑,比如要安裝到 F 盤的 openssl 目錄下,命令為:

 perl Configure VC-WIN32 --prefix=F:/openssl

5)  可能用到以下命令

     編譯動態庫:    nmake -f ms\ntdll.mak

     測試動態庫:    nmake -f ms\ntdll.mak test
     編譯靜態庫:    nmake -f ms\nt.mak
     測試靜態庫:    nmake -f ms\nt.mak test

     清除上次動態庫的編譯,以便重新編譯:    nmake -f ms\ntdll.mak clean
     清除上次靜態庫的編譯,以便重新編譯:    nmake -f ms\nt.mak clean

6) 在include子目錄下存放相關的.h標頭檔案,在out32和out32dll子目錄下都有openssl.exe檔案,out32目錄下存放靜態庫檔案:libeay32.lib(大小為13213KB)和ssleay32.lib檔案(大小為1859KB),out32dll目錄下存放動態庫及相關檔案:libeay32.dll, libeay32.lib(大小為762KB)和ssleay32.dll, ssleay32.lib(大小為65KB)檔案。儘管out32和out32dll兩個目錄下有同名檔案ssleay32.lib, libeay32.lib, 但是同名檔案不能混用,僅從檔案大小也可以看出這一點。

7) ssleay32檔案中包含與ssl協議相關的函式的實現,libeay32中包含與密碼運算相關的函式的實現。


最後可以檢查編譯出來的dll檔案是否是64位的,方法如下:

        在 http://www.dependencywalker.com/ 可以下載 depends 工具軟體,下載Dependency Walker for Win64 (x64),執行以後分別開啟ssleay32.dll和libeay32.dll,在左上方的子視窗中,可以看到SSLEAY32.dll或LIBEAY32.DLL的檔名左邊有小數字64,說明是64位的dll。(或者在Module視窗中找到SSLEAY32.dll或LIBEAY32.DLL,在同一行的CPU一欄中,可以看到值是x64,也說明是64位的dll。) 

        雖然按照上面所說方法編譯生成的檔案放在out32、out32dll目錄下,生成的庫檔名中也帶有"32"字樣,如libeay32.dll,ssleay32.lib,但不可望文生義,以為這些庫檔案就是32位的。