一、    总述:
1.    对于openvpn-2.1.0的编译,由于微软cl编译器和GNU的gcc行为不同,需要修改不多的几个源文件来适应微软的编译器
2.    对于openvpn-2.1.1的编译,根目录下没有了Makefile.w32-vc,估计作者们觉得不应该修改源文件以适应编译器,也不能保证修改源文件这种事普通用户一定能用好,因此采用了一种别的编译方式,即使用MinGW和MSYS来支持编译,不过这些包都要下载,安装,这些也要消耗不小的工作量,但是一劳永逸
3.    但是仍然能通过2.1.0的方式编译2.1.1,就是将Makefile.w32-vc复制过来,然后修改源文件
4.    Open×××依赖OpenSSL,lzo以及pkcs11-helper,因此在编译Open×××之前必须确保上述依赖库均存在,如果都已经存在了,那么直接跳到第五节开始编译Open×××;
5.    Open×××的2.1.0以及之前的版本和2.1.1版本在windows上的编译方式不同,但是基本原理都是一样的(编译+链接),因此不妨采用老版本的方式,手动拷贝makefile到新版本目录;
6.    由于windows的C编译器和GNU的编译器行为有所不同,所以需要手工修改一些文件来适应windows的编译器,下面的编译均使用“Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86”编译器以及“Microsoft (R) Incremental Linker Version 8.00.50727.42”链接器,使用其它编译器的可能需要修改的文件以及怎样修改和此处不同甚至不用修改。
二、    编译OpenSSL
    (略)
三、    编译lzo
1.    解压lzo到D:/lzo
2.    进入D:/lzo
3.    nmake -f ms/nt.mak
4.    编译结果lzo2.lib
四、    编译pkcs11-helper
1.    解压pkcs11-helper到D:/ pkcs11-helper
2.    cd D:/ pkcs11-helper/lib
3.    nmake -f Makefile.w32-vc OPENSSL=1 OPENSSL_HOME=你的OpenSSL的路径
4.    如果遇到“pkcs11h-threading.c(477) : error C2036: 'void *' : unknown size”,那么修改“ret = (unsigned)(_data->start (_data->data) - (void*)0);”为“ ret = (unsigned)(_data->start (_data->data));”
5.    编译结果:libpkcs11-helper-1.dll,libpkcs11-helper.lib
五、    编译Open×××
1.    解压openvpn-2.1.1.tar.gz到一个目录,比如D:/openvpn;
2.    拷贝openvpn的2.1.0版本下的autodefs整个目录到2.1.1版本的根目录D:/openvpn下;
3.    将openvpn的2.1.0版本下的makefile.w32-vc拷贝到2.1.1版本的根目录D:/openvpn下;
4.    修改makefile.w32-vc:
1)    将OPENSSL改成你的系统上OpenSSL的源码目录
2)    将LZO改成你的系统上lzo的源码目录
3)    将PKCS11_HELPER改成你的系统上pkcs11-helper源码目录
4)    将lzo河pkcs11-helper的库文件分别修改成你的lzo和pkcs11-helper的实际编译结果:lzo2.lib,
5.    修改makefile.w32-vc:OBJS =下面的cryptoapi.obj /后面添加一行:dhcp.obj /
6.    修改config-win32.h:
1)    #define TAP_ID tap0901->#define TAP_ID “tap0901”
2)    #define PACKAGE openvpn->#define PACKAGE “openvpn”
3)    #define PACKAGE_NAME Open×××->#define PACKAGE_NAME “Open×××”
4)    #define PACKAGE_TARNAME openvpn->#define PACKAGE_TARNAME “openvpn”
5)    #define PACKAGE_VERSION 2.1.1->#define PACKAGE_VERSION “2.1.1”
6)    注释掉下面一行:#define vsnprintf _vsnprintf
7.    修改misc.c:
const int n_rnd_bytes = 6;-> #define n_rnd_bytes 6
8.    在D:/openvpn下执行:nmake /f makefile.w32-vc
9.    编译结果:openvpn.exe

附:
1.对于openvpn-2.1.0的编译,由于微软cl编译器和GNU的gcc行为不同,需要修改不多的几个源文件来适应微软的编译器
2.对于openvpn-2.1.1的编译,根目录下没有了Makefile.w32-vc,估计作者们觉得不应该修改源文件以适应编译器,也不能保证修改源文件这种事普通用户一定能用好,   因此采用了一种别的编译方式,即使用MinGW和MSYS来支持编译,不过这些包都要下载,安装,这些也要消耗不小的工作量,但是一劳永逸
3.但是仍然能通过2.1.0的方式编译2.1.1,就是将Makefile.w32-vc复制过来,然后修改源文件。