一、下载编译SNMP++库要使用的相关文件
1、下载地址:https://www.agentpp.com/download.html
共三个压缩文件:SNMP++库文件、SNMP v3加密要用到的libdes库、vs2013工程用于编译SNMP相关库
2、将三个压缩文件放到同一文件夹中,都解压到当前目录下。(如果点击SNMP++/VS2013/SNMP++/SNMP++.sln,然后生成文件,你会发现各种找不到,原来装放源代码的文件夹SNMP++/SNMP++-3.3.4是有版本号,而工程文件的配置文件中没有版本号,所以得把版本号去掉,即修改为snmp++)
vs2013目录中包括4个文件夹AGENT++、AgentX++、libdes、SNMP++分别对应用于编译4个库的解决方案。
其中AGENT++、AgentX++可能是用于编译代理使用的库,本文不做介绍。
libdes用于编译SNMP++会使用的libdes库,直接打开文件夹中的解决方案文件libdes.sln进行编译即可(在debug目录中有生成的.lib文件),没有编译错误,本文也不做详细介绍。
修改snmp++-3.3.11文件夹为snmp++
二、编译SNMP库
由于工程文件是vs2013,本机使用的是vs2017,所以在打开\vs2017\SNMP++\SNMP++.sln时,对项目进行重定向操作
开始编译
1.尝试一下生成 SNMP++(出错了,提示找不到 libsnmp.h)
在项目“属性 -> C/C++ -> 常规–> 附加包含目录”中添加以下目录:
$(SolutionDir)\..\..\snmp++\include
$(SolutionDir)\..\..\snmp++
$(SolutionDir)\..\..\libdes
这里使用代表工程路径的宏“$(SolutionDir)”,不使用绝对路径,避免移动工程后无法编译。
2.再次生成
提示编译libsnmp.h文件时发生错误,无法打开包括文件“unistd.h”。
仔细对比一下发现报错的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项目
出现了一堆错误,观察下,主要错误有三个
pp_int64 转化警告
发现只有一处使用到了这种类型,所以暂且忽略这个警告
inet_ntop 重定义
定位到具体文件中,将其注释掉
'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings SNMP++
这个提示是 inet_ntoa 过期了,可以用 inet_ntop 或 InetNtop 代替,为了避免修改源码,我们按后面的提示,在工程属性里加 【_WINSOCK_DEPRECATED_NO_WARNINGS 】预编译项
在“配置属性 -> C/C++ -> 预处理器–> 预处理器定义”中添加宏_WINSOCK_DEPRECATED_NO_WARNINGS
4.再次生成,出现较多错误
定位错误“无法打开包括文件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.再次编译
找不到标识符“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.继续编译,仍然失败,回到了之前的错误
因为使用的是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.编译成功
8.添加测试项目【vs2017\SNMP++\snmpWalk\snmpWalk.vcxproj】,并设置为启动项,修改VC++目录
9.或创建新的测试样例
vs创建windows控制台应用程序
修改项目属性