VC++6.0中编译OpenVPN
在Windows下编译OpenVPN,一般推荐用MinGW工具,但本人尝试过多次都未成功,于是改用VC,经过比较长时间的摸索,得出以下比较繁琐的步骤,与诸初学者共享。
**************************************************************************************************
环境及工具:
Microsoft windows xp sp2
Microsoft VC++6.0
Microsoft Platform SDK 2001
ActivePerl-5.8.8.820-MSWin32-x86
OpenSSL0.9.8
lzo1.08
OpenVPN2.0.9
**************************************************************************************************
1)安装VC6.0、SDK、ActivePerl等。
2)到各官方网站上下载OpenSSL、lzo、OpenVPN的压缩包。
3)编译OpenSSL
a.将OpenSSL解压到C盘根目录下;
b.在命令提示行中进入该目录,输入perl Configure VC-WIN32,检验perl是否正确安装;
c.命令行中输入ms\do_ms;
d.命令行中转到Microsoft Visual Studio\VC98\bin,运行vcvars32.bat以配置环境变量。
e.命令行OpenSSL目录下,执行nmake –f ms\ntdll.mak 编译成功后,在out32dll目录下,会有四个文件libeay32.dll libeay32.lib ssleay32.dll和 ssleay32.lib
4)编译lzo
将lzo解压至C盘根目录,在命令行中跳至该目录,运行b\win32\mc120.bat,编译成功后生成lzo.lib
**************************************************************************************************
5)在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>,不然会报重定义错误。
h.VC中不识别unsigned long long int类型,需改为_int64。
i. 在project->setting->link下的object/library modules中添加ws2_32.lib crypt32.lib
j. Build all,应该可以搞定。