win7下用vs2013编译openvpn2.3.8源码并生成客户端

壹,准备工作

    一,下载Openvpn2.3.8的源码: https://download.csdn.net/download/sspdfn/10472537。也可以选择到官网下载,截止发稿时,最新的OpenVpn的版本是2.4.6

    二,下载openssl,我下载的是:https://download.csdn.net/download/tianfeng2006/3439810。注:我用别的版本的openssl,一直会碰上找不到外部符号的错误。

    三,下载lzo,自行前往官网下载:http://www.oberhumer.com/opensource/lzo/,我下载的是2.09版本

    四,下载tap 驱动,下载地址:https://download.csdn.net/download/sspdfn/10472564

    五,这里简单介绍下

        1、tap驱动是Open实现的核心,它可以在windows上创建一个虚拟网卡,所有的vpn操作都是基于此的。

        2、lzo是一解压缩库,类似于zip。

        3、openssl,加密用的,编译openvpn会用到这个。

贰,编译

    一、compat.lib的编译

扫描二维码关注公众号,回复: 4954343 查看本文章

        1、解压后的目录中有一个Openvpn.sln文件,用vs2013打开。打开后可以看到有四个项目,分别是Compat,msvc-generate,openvpn,openvpnserv。今天我们主要讲解对openvpn的编译。但编译openvpn时,有用到compat项目生成的lib,所以我们先把准备工作做好,先讲下compat.lib的编译。

        右键compat生成,报了一堆错,我们一个个解决。

        1、无法打开包括文件:config-msvc.h

            这个文件就在openvpn-2.3.8下。我们可以看到有一个config-msvc.h和config-msvc-version.h.in文件。我们把这个openvpn-2.3.8目录加到vc++目录的包含目录中。再次生成,发现无法打开config-msvc-version.h。还记得刚刚我们还发现一个config-msvc-version.h.in文件吗。把这个文件另存为config-msvc-version.h文件就是我们想要的。

            (另一个方法就是新建一个ThirdInclude文件,将所有的头文件都放在这里面,然后将ThirdInclude设置到VC++的包含目录中)

        2、inet_ntop,inet_pton重定义问题。

            这是因为windows已经有了inet_ntop和inet_pton这两个接口了,但另一方面compat.h又重新定义了这两个函数。既然如此,我们就只使用系统自带的函数。因此我们可以把compat.h中这两个函数注释了,或者在属性->c++->预处理器-》预处理定义中添加两个定义:HAVE_INET_NTOP;HAVE_INET_PTON;

        3、重新生成,就在win32-output中生成了compat.lib。

    二,新建一个工程VpnProj

        我们不能用openvpn自带的sln来编译。否则按三所述步骤,到最后会出现

错误	2	error MSB3073: 命令“nmake -f Makefile.mak all”已退出,代码为 2。
错误	1	error U1073: 不知道如何生成“/config-msvc-version.h.in”	

         这两个错误查了很久,不知道怎么处理,有头绪的同学,请在评论区留言          

        1、因此我们要新建一个工程,工程名叫VpnProj,选择控制台应用程序,因为Openvpn的核心Openvpn.exe程序就是一个控制台程序。勾选空项目,点完成。

        2、把openvpn-2.3.8/src/openvpn中的所有*.h,*.c文件拖到VpnProj目录中,并将这些文件载入到工程中。

        3、把lzo-2.0.9/src下的所有*.h,*.c,*.ch文件拖到VpnProj目录中,并将这些文件载入工程中


    三,编译VpnProj

        右键VpnProj生成,报了一堆错

        1、无法打开包括文件:config-msvc.h

        与编译compat.lib库一样的解决方法,不赘述。

        2、无法打开包括文件:compat.h

        将src/compat目录,添加到c++的包含目录中。

        3、无法打开lzo文件

        还记得我们下载的lzo文件吗。解压后,打到include目录,将该目录添加到c++的包含目录中

        4、无法打开openssl文件。

        同样的,解压openssl-0.9.8l压缩包,找到inc32目录,将该目录添加到c++的包含目录中

        5、无法打开openvpn-plugin.h文件

        该文件在openvpn2.3.8下的include目录中,将该目录添加到c++的包含目录中

        6、无法打开tap-windows.h

        该文件在tap-windows6-master的src目录中,将该目录添加到c++的包含目录

        7、无法打开包括文件:config-msvc.h,config-msvc-version.h

        与编译compat.lib库一样的解决方法,不赘述。

        记得把这个两个文件要添加到工程中,这很重要!

         8、inet_ntop,inet_pton重定义问题。

        与编译compat.lib库一样的解决方法,不赘述。

        另外,如果出现c4996的错误,解决方法参考 https://blog.csdn.net/u010368556/article/details/79344265,或者添加_CRT_SECURE_NO_WARNINGS 宏和_CRT_NONSTDC_NO_WARNINGS 宏到预处理器定义

        

        9、无法解析的外部符号 _imp_closesocket@4

        右键属性,链接器->输入->附加依赖项,添加wininet.lib;crypt32.lib;iphlpapi.lib;winmm.lib;ws2_32.lib;

        10、无法解析的外部符号 _basename。

        还记得我们编译出的compat.lib库吗。在VpnProj下新建lib目录,把compat.lib复制到此。然后把lib目录添加到属性-》链接器-》常规-》附加库目录中。然后把compat.lib添加到附加依赖项中。

        11、无法解析的外部符号 _ASN1_BIT_STRING_FREE

        把openssl_out32dll中的libeay32.lib和ssleay32.lib复制到lib目录中,同时将这两个库添加到附加依赖项中

四、如果出现以下错误

        1、无法打开pkcs11-helper-1.0/pkcs11h-certificate.h

        这是一难点。因为当把这个文件导入后,会引发出更多问题,到后面就走向了绝路。但事实上,这个文件其实根本没必要引入!

        我们打开config-msvc.h编辑,并注释以下:

        //#define ENABLE_PKCS11 1

        2、如果出现错误:未知字符:0x40

        打开config-msvc-version.h,将下面三个宏

#define OPENVPN_VERSION_RESOURCE @PRODUCT_VERSION_RESOURCE@
#define TAP_WIN_MIN_MAJOR @PRODUCT_TAP_WIN_MIN_MAJOR@
#define TAP_WIN_MIN_MINOR @PRODUCT_TAP_WIN_MIN_MINOR@

改为

#define OPENVPN_VERSION_RESOURCE 1.0.0.0
#define TAP_WIN_MIN_MAJOR 9
#define TAP_WIN_MIN_MINOR 21

        3、如果出现语法错误;

问题定位到
const cipher_kt_t *cipher_ctx_get_cipher_kt (const cipher_ctx_t *ctx)
  __attribute__((nonnull));

无法识别__attribute,这是一个编译选项,注释就行。

const cipher_kt_t *cipher_ctx_get_cipher_kt (const cipher_ctx_t *ctx)
/*  __attribute__((nonnull))*/;

   




猜你喜欢

转载自blog.csdn.net/sspdfn/article/details/80656470