SNMP_00:SNMP++静态库编译(Win7、VS、SNMP++3.3.11a)

时间:2024-04-12 12:39:53


编译环境:Win7 64bit + VS2010

SNMP++版本:3.3.11a

LIBDES版本:4.01a


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

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

SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)

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


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

 SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)

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

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

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

用文本编辑器打开vs2013文件夹下的README.win32文件,文档中描述如下:

SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)

文档中要求libdes、snmp++、vs2013三个文件夹在同一目录下,修改snmp++-3.3.11文件夹为snmp++,下面还有一段话要求“Win32平台下应删除\snmp++\include\snmp_pp目录下的config_snmp_pp.h文件,而使用\vs2013\SNMP++\include\snmp_pp目录下的config_snmp_pp.h文件”。

暂时先不去删除替换文件,实际在折腾了一天后发现,与文档描述的恰恰相反应该使用

\snmp++\include\snmp_pp\config_snmp_pp.h

而不是

\vs2013\SNMP++\include\snmp_pp\config_snmp_pp.h

我们先按文档中要求的进行编译。


二、编译SNMP库

打开\vs2013\SNMP++\SNMP++.sln工程,由于本机是VS2010,而工程文件是VS2013,修改“配置属性->常规->平台工具集”为v100。

SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)


1、 开始编译,生成失败。

 SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)

参考博客“win下SNMP++编译手记”

https://blog.csdn.net/yp541118319/article/details/65628175

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

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

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

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

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

SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)


2、再次编译,仍然失败,显示如下:

SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)

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

网上查了一下unistd.h可能是UNIX系统或类UNIX系统中包含的文件,用工具查找了一下Windows下确实没有此文件。仔细对比一下发现报错的libsnmp.h文件是在库目录\snmp++下,而工程目录\vs2013\SNMP++\include下还有一个libsnmp.h文件,既然vs工程目录中已有libsnmp.h文件,那就用\vs2013\SNMP++\include\libsnmp.h覆盖一下\snmp++\libsnmp.h,同时在VS的“解决方案资源管理器”的头文件列表中移除原libsnmp.h(实际双击会提示无法打开文件),重新添加\snmp++\libsnmp.h文件。


3、再次编译,仍然失败,显示如下:

SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)

此时显示的错误变成了:无法打开包括文件“iostream.h”。

网上查了一下#include <iostream.h>是在旧的标准C++中使用,而在新标准中使用#include<iostream>,此处用STDCXX_98_HEADERS宏作为编译开关,查找代码发现此宏在config.h文件中定义,而config.h文件又是在libsnmp.h文件头部包含进来的,代码如下:

SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)

包含config.h文件的前提是要先定义HAVE_CONFIG_H宏,但在工程中没有找到此宏的定义。还是参考博客“win下SNMP++编译手记”

https://blog.csdn.net/yp541118319/article/details/65628175

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

HAVE_CONFIG_H; _CRT_SECURE_NO_WARNINGS;

SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)


4、再次编译,仍然失败,显示如下:

SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)

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

再次编译,此时的错误和警告就更多了,大致如下:

SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)

其中,警告C4552可以通过“配置属性 -> C/C++ -> 高级 -> 禁用特定警告”设置禁用提示,如下:

SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)

定位错误“无法打开包括文件openssl/des.h”,当定义了_USE_OPENSSL宏才包含openssl/des.h文件,查找_USE_OPENSSL宏,在config_snmp_pp.h文件中定义。注意:有两个config_snmp_pp.h文件,一个在库目录下\snmp++\include\snmp_pp,一个在VS工程目录下\vs2013\SNMP++\include\snmp_pp,我们先按\vs2013\README.win32文件中描述的那样,用\vs2013\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、再次编译,仍然失败,显示如下:

SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)

找不到标识符“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、再次编译,仍然失败,又回到之前的错误状态:

 SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)


定位错误“无法打开包括文件openssl/des.h”,还是参考博客“win下SNMP++编译手记”

https://blog.csdn.net/yp541118319/article/details/65628175

因为使用的是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


定位错误“无法打开包括文件inttypes.h”,百度发现VS2010下没有此文件,查找HAVE_INTTYPES_H宏,修改config.h文件81行如下:

#undef HAVE_INTTYPES_H


7、再次编译,仍然失败,出现的错误都是关于std::string,错误代码C2784,网上百度此错误是因为没有导入头文件#include <string>,参考博客“win下SNMP++编译手记”

https://blog.csdn.net/yp541118319/article/details/65628175

中提到在log.h中添加include <string.h>,但打开此文件发现已经有include<string.h>代码,索性接着再添加#include <string>。


8、再次编译,终于见到了 “成功1个,失败0个,……”,虽然还有一些警告,那都不是事儿了。

SNMP_00:SNMP++静态库编译(Win7、VS2010、SNMP++3.3.11a)


至此SNMP++库编译完成,写的比较啰嗦,主要是想尽可能的把编译过程中遇到的问题都列举出来。因为每个人的编译环境不同,遇到的问题可能也不相同,在此给大家更多的参考。下面重写一个快速简化的编译步骤,方便自己记录,也方便大家编译。


三、快速编译SNMP++库


0、准备

从官方网站下载编译SNMP++库要用到的三个压缩文件snmp++-3.3.11a.tar.gz、libdes-l-4.01a.tar.gz、vs2013.zip。

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

重命名文件夹snmp++-3.3.11为snmp++。

打开解决方案\vs2013\SNMP++\SNMP++.sln。


1、修改工具集

修改“配置属性->常规->平台工具集”为v100


2、添加附加包含目录

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

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


3、添加预处理器宏

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

HAVE_CONFIG_H; _CRT_SECURE_NO_WARNINGS;


4、禁用警告

   在“配置属性 ->C/C++ -> 高级 -> 禁用特定警告”中添加警告代码4522


5、复制文件

源文件\vs2013\SNMP++\include\config.h,目标目录\snmp++。

源文件\vs2013\SNMP++\include\libsnmp.h,目标目录\snmp++。


6、重新添加文件

删除“解决方案资源管理器”头文件列表中的config.h、libsnmp.h、config_snmp_pp.h文件,重新添加文件

\snmp++\config.h

\snmp++\libsnmp.h

\snmp++\include\snmp_pp\config_snmp_pp.h


7、修改config_snmp_pp.h文件

74行修改如下:

#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


8、修改config.h文件

   81行修改如下

#undef HAVE_INTTYPES_H


9、修改log.h文件

   40行添加如下:

#include <string>


10、编译。



附资源下载地址:

https://download.csdn.net/download/gada352/10446191

包括编译SNMP++要使用的源文件,编译完成的静态库文件,详细的编译笔记。


本人也是初次接触SNMP,文档中如果有模糊不清或者错误的地方请大家评论指正。