1)编译环境
VC 2008 Express 或者更高版本
Windows SDK 6.1 或者更高版本
ActivePerl 5.8 或者更高版本
软件包
lzo-2.03 http://www.oberhumer.com/opensource/lzo/
openssl-0.9.8k http://www.openssl.org/
pkcs11-helper-1.07 http://www.opensc-project.org/pkcs11-helper/
openvpn-2.1.1 http://openvpn.net/
2)编译并且运行测试程序 lzo
>cd lzo-2.03
>B\win32\vc.bat
>lzotest -mlzo configure
3)编译OpenSSL
NASM可以从官方下载我直接解压缩到C:\NASM-0.98.39,openssl解压到C:\openssl-0.9.8e,ActivePerl安装到C:\Perl。
注意事项:
首先在环境变量path中增加了C:\Perl\bin;c:\NASM-0.98.39;D:\Microsoft Visual Studio\VC98\Bin;D:\Microsoft Visual Studio\Common\MSDev98\Bin
添加完毕就不会出现诸如perl、nmake命令无效之类的问题了。如"NMAKE : fatal error U1077: 'ml' : return code '0x1' Stop."之类。
另外在编译过程中会出现不能打开包含文件的错误,如"fatal error c1083:cannot open include file 'windows.h',no such file file or directory",为此层尝试修改过系统变量的path,无效,最终的解决办法很简单,将所有需要的直接拷贝到openssl-0.9.8e文件夹下就可以了,为了方便我直接将D:\Microsoft Visual Studio\VC98\Include下和D:\Microsoft Visual Studio\VC98\Lib下的所有文件拷贝到了c:\openssl-0.9.8e下,嘿嘿。
准备完毕就可以开始了:)
开始编译:
开始:)
步骤・1:perl Configure VC-WIN32 --prefix=c:/some/openssl/dir 其中c:/some/openssl/dir是你要安装openssl的目标文件夹。
步骤・2:ms\do_nasm
步骤・3:nmake -f ms\ntdll.mak
步骤・4:nmake -f ms\ntdll.mak test
步骤・5:nmake -f ms\ntdll.mak install
ok 编译安装结束
,在out32dll目录下,会有四个文件libeay32.dll libeay32.lib ssleay32.dll和 ssleay32.lib
4)编译lzo
将lzo解压至C盘根目录,在命令行中跳至该目录,运行b\win32\mc120.bat,编译成功后生成lzo.lib
5)编译 pkcs11-helper
>cd lib
>nmake -f Makefile.w32-vc OPENSSL=1 OPENSSL_HOME=q:/openvpn/openssl-0.9.8k
编译中你可能会遇到一个错误“pkcs11h-threading.c(477) : error C2036: 'void *' : unknown size”
这是由于pkcs11h-threading.c (477)的 ret = (unsigned)(_data->start (_data->data) - (void*)0);
改成: ret = (unsigned)(_data->start (_data->data));
我真不觉得计算指针的值有必要用那么复杂,直接类型转换就好了
6)在VC中编译OpenVPN
a. 在VC中新建一个名字为OpenVPN的win32 application工程,类型为an empty project。将OpenVPN解压到该工程目录下,将…\OpenVPN目录下的.c文件添加到source files中,将.h文件添加到header files中。
b.将编译成功的lzo.lib libeay32.lib ssleay32.lib添加到工程中,并将libeay32.dll ssleay32.dll拷贝到Debug目录下。
c.将lzo和OpenSSL的两个include目录添加到VC的路径中:C:\lzo-1.08\include C:\openssl-0.9.8\include。设置的方法为,在VC中,选择tools->options,在directories选项卡下添加。
d.将SDK的目录…\Microsoft SDK\Include添加到VC路径中,并将其调整到…\Microsoft Visual Studio\VC98\Include之前。
e.由于创建的是win32 application,需修改默认的调用run-time library的方式,在projects->settings->C/C++,Category选择Code Generation,Use run-time library选择Debug Multithread DLL。
f. 由于创建的是win32 application,默认入口函数是WinMain,而OpenVPN源码的入口函数为openvpn.c中的main函数,需修改设置,以免出现error LNK2001:unresolved external symbol _WinMain@16的错误。
进入project->setting->c/c++,在category中选择preprocessor,在processor definitions中删除_WINDOWS, 添加_CONSOLE;在Project options中将/subsystem:windows.改为/subsystem:console。
g.在config-win32.h中注释掉#include <windows.h>,不然会报重定义错误。//#include "autodefs/defs.h
h.VC中不识别unsigned long long int类型,需改为_int64。
i. 在project->setting->link下的object/library modules中添加ws2_32.lib crypt32.lib
打开 config-win32.h 注意以下几行,原本的预处理宏后面的字符串是不带引号了,vc要求引号,否则编译出错。
#define PACKAGE "openvpn"
#define PACKAGE_NAME "OpenVPN"
#define PACKAGE_TARNAME "openvpn"
#define PACKAGE_VERSION "2.1.1"
注释掉以下这行,否则和vc的定义冲突,会出很多error
#define vsnprintf _vsnprintf
* 打开 misc.c 1200行附近
把const int n_rnd_bytes = 6;
替换成#define n_rnd_bytes 6
vc还不支持变量作为栈变量数组的size
j. Build all,应该可以搞定。