在Win32下編譯openvpn-2.1_rc15
一、下載必要的軟體包
1)openvpn-2.1-rc15, 在www.openvpn.org
2)openssl,在www.openssl.org下載openssl-0.9.8i.tar.gz
3)lzo,文件名為lzo-2.03.tar.gz
4)ActivePerl-5.8.0.806-MSWin32-x86.msi (編譯openssl用的,下載后雙擊安裝,默認安裝目錄: C:\Perl)
二,編譯openssl
進入dos,在openssl根目錄下
〉Perl Configure VC-WIN32 (注意VC-WIN32要大寫)
〉ms\do_ms
dos下進入安裝vc的目錄,找到vcvars32.bat,運行它(一般在安裝路徑的VC98/bin下)
dos下進入openssl根目錄下,執行 nmake -f ms\ntdll.mak
開始編譯
如果編譯成功,會生成inc32目錄(下面包含我們需要的頭文件),lib和dll輸出在out32dll目錄下
包括libeay32.dll,libeay32.lib,ssleay32.dll,ssleay32.lib)
三、編譯lzo
dos下進入安裝vc的目錄,找到vcvars32.bat,運行它(一般在安裝路徑的VC98/bin下)
切換到lzo的根目錄
運行b\win32\vc.bat,成功后在lzo的根目錄下會有lzo2.lib(可能是靜態庫,因為沒有生成lzo2.dll,^-^)
四、編譯openvpn
1)用vc2003生成一個控制台工程,並將工程種原有的文件刪除(stdafx.h stdafx.cpp 還有一個xx.cpp)
將openvpn根目錄下所有的.h .c文件全部加入到工程
在工程下新建include, lib目錄
例如 d:\openvpn\include d:\openvpn\lib
將openssl中inc32目錄下的openssl目錄全部CP到d:\openvpn\include下
將lzo中的include目錄下的lzo目錄全部CP到d:\openvpn\include下
將lzo2.lib, libeay32.lib, ssleay32.lib複製到d:\openvpn\lib下
2)設置工程:C/C++選項中設置--常規--附加包含目錄中加上:d:\openvpn\include(相對路徑更好)
鏈接器--常規--附加庫目錄中加上d:\openvpn\lib
鏈接器--輸入--附加依賴項加入
lzo2.lib
ssleay32.lib
libeay32.lib
ws2_32.lib
iphlpapi.lib
crypt32.lib
Wininet.lib
3)修改config-win32.h
// 換個順序
#include <winsock2.h>
#include <windows.h>
註釋掉
#include "autodefs/defs.h"
給下面這些字義加上""號
#define PACKAGE "openvpn"
#define PACKAGE_NAME "OpenVPN"
#define PACKAGE_TARNAME "openvpn"
#define PACKAGE_VERSION "2.1_rc15"
.......
在這裡
#ifdef _MSC_VER
/* MSVC++ hacks */
#include <io.h>
#include <direct.h>
#define vsnprintf _vsnprintf
#define vsnwprintf _vsnwprintf
#define snwprintf _snwprintf
// 加下面一句
#define strcasecmp _stricmp
4)在RELEASE版本下,還要去掉memcmp.c文件
5)編譯,如果出現錯誤根據情況排錯吧! 我的是成功了,祝各位好運
[ 本帖最後由 fly6 於 2008-12-19 09:09 編輯 ]
《解決方案》
照上面的方法我又在vista下面弄了一次,但運行時出錯,調試時發現
verify_callback (int preverify_ok, X509_STORE_CTX * ctx)函數中
session->verified = true;
//free ( subject);出錯!因為subject是在dll中分配的,但是奇怪,難道linux的內存管理就不會出錯
OPENSSL_free(subject);//只好改成這句了