QT5.14.2使用SNMP++(亲测可用)
实现思路:下载snmp++源码 ——> VS编译源码生成lib库 ——> Qt程序添加lib库和头文件目录
注意事项:
1.因为snmp++源码的关系,所开发程序必须使用32位编译器
2.QT和VS版本的对应关系,可以参考这里可以参考这里
3.QT必须使用对应于VS版本的MSVC(32位)编译器
4.32(64)位的lib库64(32)位编译器识别可能会出错
目录
资源准备:
1.VS2017
2.QT5.14.2(安装时勾选MSVC64、MSVC32、MingGW64、MinGW32)
3.源码下载:libdes-l-4.01a.tar.gz
snmp++-3.4.6.tar.gz
vs2013.zip
编译准备
1.将下载的源码解压
2.将vs2013重命名2017,snmp++-3.4.6重命名为snmp++
3.进入libdes-l-4.01a,用libdes文件夹代替libdes-l-4.01a
4.形成如下形式:
编译libdes.lib
1.进入vs2017/libdes目录,打开libdes.sIn文件,遇到弹出按提示重定向项目点击确定;
2.右键生成,没有报错一帆风顺,在debug目录下也生成了相应的libdes.lib
编译snmp++.lib:
1.用vs2017\SNMP++\include\snmp_pp\config_snmp_pp.h 替换snmp++\include\snmp_pp\config_snmp_pp.h
2.进入vs2017/SNMP++/目录,打开SNMP++.sIn,同样弹窗提示重定向项目点击确定
3.右键点击SNMP++,属性中添加附加包含目录
4.右键点击SNMP++,属性中添加预处理器: _WINSOCK_DEPRECATED_NO_WARNINGS
5.用\vs2017\SNMP++\include\libsnmp.h文件替换掉\snmp++\libsnmp.h文件,在vs目录树中删除无效的libsnmp.h,在重新添加刚才替换过得libsnmp.h
5.
6.右键生成项目报错,只用解决这两个错误即可
7.定位pp_int64到文件位置,使用int64_t替换
8.定位错误inet_ntop重定义到文件位置,注释函数声明
9.右键生成项目成果,SNMP++.lib生成成功
Qt5.14.2使用SNMP++:
1.打开QT5.14.2新建项目,注意编译器的勾选
2.测试代码
#include <QCoreApplication>
#include <iostream>
#include <snmp_pp/snmp_pp.h>
#include <list>
#include <QString>
#include <libsnmp.h>
#ifdef WIN32
#define strcasecmp _stricmp
#endif
#ifdef SNMP_PP_NAMESPACE
using namespace Snmp_pp;
#endif
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int status1;
Snmp::socket_startup();
//设置目标地址
UdpAddress address("192.168.146.128");
//设置目标端口
address.set_port(1611);
CTarget *ctarget1 = new CTarget(address);
ctarget1->set_readcommunity("public");
Snmp *snmp1 = new Snmp(status1);
Vb vb1(".1.3.6.1.2.1.1.5..0");
//Snmp snmp1(status1);
Pdu pdu1; // SNMP++ PDU
pdu1 += vb1;
if (status1 != SNMP_CLASS_SUCCESS) { // check creation status
cout << snmp1->error_msg(status1);
// if fail, print error string
return 0;
}
// vb1.set_value("3"); // add location string to vb
pdu1 += vb1; // add the variable binding
status1 = snmp1->get(pdu1, *ctarget1);
cout << snmp1->error_msg(status1);
pdu1.get_vb(vb1, 0);
std::string reply = vb1.get_printable_value();
cout << reply << endl;
system("pause");
delete ctarget1;
ctarget1 = NULL;
delete snmp1;
snmp1 = NULL;
return a.exec();
}
3.QT添加外部库(SNMP++.lib和libdes.lib)
4.QT添加包含目录,将刚VS中的附加包含目录在QT中也配置一次
5.QT添加预处理器:
DEFINES += _WINSOCK_DEPRECATED_NO_WARNINGS
6.QT添加Ws2_32.lib库
LIBS += -lWs2_32
6.编译运行测试代码,注意选择编译器,报错定位后将<iostream.h>改为<iostream>即可
7.再次编译运行,执行成功,得到OID对应的返回值