SNMP++3.3编译

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q294971352/article/details/83893289

前言

因为项目需要用到snmp协议,然后网上搜了一下,开源的库热度比较高的一个是snmp++和net-snmp,接下来就开始了我的漫长的编译之旅。。。

正文

上述的两个库我都下载了下来,是因为一开始我下载的snmp++没有编译过,然后又试了试net-snmp,发现也是个坑。

无处安放的编译环境

由于我需要编译windows下的库,看了看源码中README和INSTALL文档,无一例外需要nmake编译。坑就坑在这一点,我的电脑是Win10 + VS2015,一开始按照文档中写的用powershell + perl配置了Configure,由于之前没接触过这种编译方式,一开始搞也花了一段时间。等终于配置好了Configure过后,满心欢喜的以为接下来就是nmake,nmake install。然后nmake一下,脸上的笑容逐渐消失,正常的情况应该就是打印各种编译信息的时候,结果是这样的:

 what???我可是有宇宙IDE VS2015的人,怎么会没有nmake,然后去各种百度,我这里又要吐槽了这百度首页上全是同一篇博客,各种转载,越来越明白为什么更多人喜欢用bing或者是google了。

回归到主题,网上的人基本都是说运行vcvars32.bat文件,然而我运行了过后发现什么事情都没发生,也没echo出一条错误,这就很奇怪了,然后通过修改此文件,添加一下打印信息,发现也没毛病啊,为什么环境变量没有设置呢???

真相只有一个:通过set命令设置环境变量时,路径中不能有空格!!!!

WOC这让我怎么办,自己手动添加呗 ,此时熟练的右击我的电脑-->属性-->高级系统设置-->环境变量-->修改PATH环境变量-->打开shell 输入set PATH=C:,操作一气呵成,脸上再次漏出阴险的笑容,各位自行脑补。

再次打开powershell,输入nmake 打印出了信息:

然后切换到snmp++的路径,namke,然后编译信息出来,然而编译了第一个文件就打印没找到<stdlib.h> ,再次黑人问号what???我可是有VS2015的人啊!

然后琢磨了半天,再想了想vcvars32.bat文件的作用,emmmm......nmake编译的环境全没有,然后我又手动的一条一条的加到环境变量里面。这里我一开始是以为我的VS2015没有安装好,所以电脑没有编译环境,然后重新安装了N次好像还是不行,又恰好这段时间win10有一堆bug,特别是那个无法改默认打开方式的bug,真的很恶心,顺便也提一下解决方法:卸载更新KB4462933还有KB4462919,然后重启电脑。

所以一开始以为是我电脑的系统都出问题了,我又把系统重置了一遍,然后按照重新安装VS发现结果还是一样。。。这个时候我想到了交叉编译,用mingw也可以编译出我想要的东西,而且我本来的目的就是用Qt写一个上位机,Qt的编译环境也刚好是mingw,此时又开始了下一段旅程。。。

有同学就想说了,snmp++里面不是有.sln的工程吗,直接用VS编译不就好了,提到这个就更气了,一开始其实我就是这样做的,然而工程一编译一堆的错误,有可能是因为给的工程是VS2013的原因。然后那时候也是纠结了一两天,改来改去是把库编译出来了,但是发现不能用。。。在工程中一引用就会报找不到某某函数之类的错误。。

使用MinGW编译

使用MinGW编译,一开始也就是直接在powershell里面搞,但是发现这样行不通,每次Configure都直接guess为VS的编译环境,指定为MnGW和编译头都不行,然后又看了看README,原来可以用msys环境,然后我一开始用老版本的Mingw和msys配置编译,这时我先编译的OpenSSL,开始用perl Configure时,就直接提示我的msys中的perl版本太低。。。然后又千辛万苦在百度无数重复的博客中找到了,可以使用msys2+MinGW-w64的方法,而且也了解到现阶段最新的MinGW是以MinGW-w64发布的,怪不得用MinGW Installer安装的MinGW还是2013年的,还以为MinGW没更新了,给我这种错觉的来源还有就是Qt最新的版本一直都还在用MinGW5.3.0。。。

又是经过一段时间,前前后后花了我4天的时间了,最后我还是编译通过了,用上了snmp++,此时已经泣不成声。。。

文件版本与编译配置

个人以为写了配置不写文件版本的人都是在耍流氓,不同版本的编译很多时候都不一样好么,我使用的文件版本为:

  • OpenSSL 1.1.1
  • SNMP++3.3

OpenSSL的配置为:

./Configure --cross-compile-prefix=xxx mingw --prefix=xxx

编译头--cross-compile-prefix可以根据实际的MinGW头更改,如果是在msys2的环境下其实可以省略,因为我默认只安装了MinGW,所以使用的gcc肯定是MinGW的。路径也需要自己选择,由于是在msys2下,电脑的路径最好改为像linux下的格式,比如安装在D:\OpenSSL下,就写成--prefix=/d/OpenSSL最好。

等OpenSSL编译好了过后,编译SNMP++:

./configure --prefix=/d/snmp++ --with-libssl-prefix=/d/OpenSSL --disable-threads

这里有个配置需要注意,就是--disable-threads,这是由于编译到snmpWalkThreads时提示的:

This example is not available on WIN32 platforms!

然后我把这个选项给禁了,具体有什么影响还没研究过。。。

这里还有一个需要注意的地方就是这个SNMP++的configure非常的缺心眼,一般OpenSSL库都会变异成ssl和crypto两个库,然而生成的Makefile中只引用了-lssl。。。这个时候需要修改主目录,consoleExamples,src,include,include/snmp_pp五个目录下的Makefile,在所有的-L/d/OpenSSL/lib -lssl后面添加-lcrypto。

然后make && make install,在安装目录下就有libsnmp++.a库文件了,再次泪崩。

使用

把snmp++安装目录的include和lib复制到我们的工程中,然后修改.pro文件:

INCLUDEPATH += $$PWD/snmp++/include

LIBS += -L$$PWD/snmp++/lib/ -lsnmp++

#LIBS += $$PWD/snmp++/lib/libsnmp++.a

LIBS += -lws2_32 -lwsock32

这里需要注意的是,需要ws_32和wsock32这两个库。对于使用像我这种win10系统编译的snmp++,由于ws2_32库的原因无法兼容到XP,需要兼容XP的同学须知。

猜你喜欢

转载自blog.csdn.net/q294971352/article/details/83893289
3.3