一、下载编译SNMP++库要使用的相关文件


1、下载地址:https://www.agentpp.com/download.html

VS2017编译SNMP++步骤记录

共三个压缩文件:SNMP++库文件、SNMP v3加密要用到的libdes库、vs2013工程用于编译SNMP相关库

2、将三个压缩文件放到同一文件夹中,都解压到当前目录下。

 vs2013目录中包括4个文件夹AGENT++、AgentX++、libdes、SNMP++分别对应用于编译4个库的解决方案。

其中AGENT++、AgentX++可能是用于编译代理使用的库,本文不做介绍。

libdes用于编译SNMP++会使用的libdes库,直接打开文件夹中的解决方案文件libdes.sln进行编译即可,没有编译错误,本文也不做详细介绍。
修改snmp++-3.3.11文件夹为snmp++

VS2017编译SNMP++步骤记录

二、编译SNMP库

由于工程文件是vs2013,本机使用的是vs2017,所以在打开\vs2017\SNMP++\SNMP++.sln时,对项目进行重定向操作

VS2017编译SNMP++步骤记录

开始编译

1.尝试一下生成 SNMP++(出错了,提示找不到 libsnmp.h)

VS2017编译SNMP++步骤记录

在“属性 -> C/C++ -> 常规–> 附加包含目录”中添加以下目录:

$(SolutionDir)\..\..\snmp++\include

$(SolutionDir)\..\..\snmp++

$(SolutionDir)\..\..\libdes

这里使用代表工程路径的宏“$(SolutionDir)”,不使用绝对路径,避免移动工程后无法编译。

2.再次生成

提示编译libsnmp.h文件时发生错误,无法打开包括文件“unistd.h”。

VS2017编译SNMP++步骤记录

仔细对比一下发现报错的libsnmp.h文件是在库目录\snmp++下,而工程目录\vs2017\SNMP++\include下还有一个libsnmp.h文件,既然vs工程目录中已有libsnmp.h文件,那就用\vs2017\SNMP++\include\libsnmp.h覆盖一下\snmp++\libsnmp.h,同时在VS的“解决方案资源管理器”的头文件列表中移除原libsnmp.h(实际双击会提示无法打开文件),重新添加\snmp++\libsnmp.h文件。
 

类似的再次生成后会报错:无法打开包括文件“config.h”。

此文件在vs工程目录vs2017\SNMP++\include下,而之前在附加包含目录中添加的三个目录中没有此目录,直接把vs2017\SNMP++\include\config.h文件复制到与vs2017同级的\snmp++目录下,同时在VS的“解决方案资源管理器”的头文件列表中移除原config.h(解决方案中已添加的是vs2017\SNMP++\include\config.h),重新添加\snmp++\config.h文件。

3.继续尝试编译SNMP项目

VS2017编译SNMP++步骤记录

出现了一堆错误,观察下,主要错误有三个

pp_int64  转化警告

VS2017编译SNMP++步骤记录

发现只有一处使用到了这种类型,所以暂且忽略这个警告

VS2017编译SNMP++步骤记录

inet_ntop 重定义

VS2017编译SNMP++步骤记录

定位到具体文件中,将其注释掉

VS2017编译SNMP++步骤记录

'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings SNMP++ 

VS2017编译SNMP++步骤记录

这个提示是 inet_ntoa 过期了,可以用 inet_ntop 或 InetNtop 代替,为了避免修改源码,我们按后面的提示,在工程属性里加 【_WINSOCK_DEPRECATED_NO_WARNINGS 】预编译项

在“配置属性 -> C/C++ -> 预处理器–> 预处理器定义”中添加宏_WINSOCK_DEPRECATED_NO_WARNINGS

VS2017编译SNMP++步骤记录

4.再次生成,出现较多错误

VS2017编译SNMP++步骤记录

定位错误“无法打开包括文件openssl/des.h”

当定义了_USE_OPENSSL宏才包含openssl/des.h文件,查找_USE_OPENSSL宏,在config_snmp_pp.h文件中定义。注意:有两个config_snmp_pp.h文件,一个在库目录下\snmp++\include\snmp_pp,一个在VS工程目录下\vs2017\SNMP++\include\snmp_pp,我们先按\vs2017\README.win32文件中描述的那样,用\vs2017\SNMP++\include\snmp_pp\config_snmp_pp.h文件覆盖一下\snmp++\include\snmp_pp\config_snmp_pp.h文件,同时在VS的“解决方案资源管理器”的头文件列表中移除原config_snmp_pp.h,重新添加\snmp++\include\snmp_pp\config_snmp_pp.h文件
 

5.再次编译

VS2017编译SNMP++步骤记录

找不到标识符“pp_int64”,搜索发现整个工程目录中没有此标识符,但是在config_snmp_pp.h文件中有“pp_uint64”的定义,会不会在被覆盖掉的config_snmp_pp.h(原snmp++库目录\snmp++\include\snmp_pp下的)文件中呢?

重新从压缩包snmp++-3.3.11a.tar.gz中解压config_snmp_pp.h文件,果然找到了“pp_int64”的定义,与README.win32文件中描述的恰恰相反,还是应该使用snmp库自带的config_snmp_pp.h文件,重新覆盖此文件至\snmp++\include\snmp_pp目录。

6.继续编译,仍然失败,回到了之前的错误

VS2017编译SNMP++步骤记录

因为使用的是libdes库,从74行开始修改config_snmp_pp.h文件,如下:

#if 0

#define HAVE_LIBSSL 1

#endif

#if 0

#define HAVE_LIBTOMCRYPT 1

#endif

#if 1

#define HAVE_LIBDES 1

#endif

#if 0

#define HAVE_PTHREAD 1

#endif

7.编译成功

VS2017编译SNMP++步骤记录

相关文章: