在VC中編譯和使用OpenSSL
阿新 • • 發佈:2019-01-26
本文介紹在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版本
一、編譯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版本