1. 程式人生 > >在VC中編譯和使用OpenSSL

在VC中編譯和使用OpenSSL

    本文介紹在VC 6.0中編譯和使用OpenSSL的過程。

一、編譯OpenSSL

    在編譯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 test

    安裝動態庫:
    nmake -f ms/ntdll.mak install
    安裝靜態庫:
    nmake -f ms/nt.mak install

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

二、使用OpenSSL

    在VC中配置使用以上的函式庫:
    點選選單:Tools -> Options,彈出對話方塊"Options",在該對話方塊中選擇"Directories"標籤。
    在"Show directories for:"的"Include files"選項中新增目錄"C:/openssl/include";"Library files"選擇中新增目錄"C:/openssl/lib"。
    然後在需要連結OpenSSL函式庫的工程中編譯時加入"libeay32.lib"就可以了。

三、問題

    我在連結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即可。

四、附錄:在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版本