最近在做一个项目,微信登录功能,以前是网站来完成微信账号注册,奈于公司人员架构上无法实现此功能,转由服务器来实现。方法多种多样。
1)libcurl简单明了,然后select来实现异步,如果要求更高者高并发,可以用epoll来完成。
2)libevent+openssl(为什么要用openssl呢,微信请求后台验证网址https,如果请求是http的那么可以不需要编译带openssl的libevent库,当然上面libcurl也是同样需要openssl库来支持https请求的)
当然这2种方法均已实现(惭愧,对libevent不了解,为了项目进度先用libcurl熟悉的code来完成),由于项目是基于libevent库的,还时删除libcurl库,用libevent来完善支持吧。
言归正传,本文主要解决的是如何编译出libevent库,已经编译出支持openssl安全加密协议的libevent库
一、下载源码(http://libevent.org/)解压
1)本文下载为2.1.8版本
https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
2)文件结构如下所示
三、VS2017编译libevent库
1)新建空项目
2)修改项目属性(当然根据自己项目需要选择)
3)复制libevent文件里的源代码文件至新建工程项目中
这一步还是挺多地方要注意,没关系我们一步步解决错误
1、我们把复制过来的.c文件全部鼠标拖至新建工程源文件中
2、同样的方法把.h文件拖至头文件中
3、当然我们还有几个头文件没加入,我们先编译下,等提示出错,再解决。
4、编译
5、编译错误提示
(1)error C2061: 语法错误: 标识符“HCRYPTPROV”
arc4random.c(55):#include
既然报错,那么先把arc4random.c文件从项目排除,注意是排除不是删除。
(2)fatal error C1083: 无法打开包括文件: “event2/event-config.h”: No such file or directory
把include文件拷贝至新项目中,WIN32-Code\nmake\event2里的event-config.h拷贝新项目include/event2/中
(3)fatal error C1083: 无法打开包括文件: “sys/queue.h”: No such file or directory
把compat文件拷贝至新项目中,同时改变项目属性
(4)evthread_pthread.c(32): fatal error C1083: 无法打开包括文件: “pthread.h”: No such file or directory
哪个文件报linux头文件找不到,我们就删哪个.c文件,删除evthread_pthread.c
(5)evutil.c(1968): error C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
添加预定义,编译器提升的好处是,不安全函数都将变为错误提示。
(6)buffer.c(3107): error C4996: 'read': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _read. See online help for details.
提示的意思是:read名字换成_read,真是有点意思,改源码吧。下面的close换成_close。
(7)bufferevent_openssl.c(66): fatal error C1083: 无法打开包括文件: “openssl/bio.h”: No such file or directory
我们先把这个文件排除把,这个文件就是支持openssl文件,如果不需要ssl安全加密,那么可以删除。
(8)epoll_sub.c(30): fatal error C1083: 无法打开包括文件: “sys/param.h”: No such file or directory
同上错误4,直接删除epoll_sub.c
(9)evdns.c(3821): error C4996: 'GetVersion': 被声明为已否决
直接添加#pragma warning(disable: 4996)来忽略
(10) error LNK2019: 无法解析的外部符号 __imp__ioctlsocket@12,该符号在函数 _get_n_bytes_readable_on_socket 中被引用
6、最后编译出来dll库
至此我们就编译出来了dll库了,太辛苦了,这么多错误,一个一个解决,其实还是很简单,当然你们以为这样就完了!
四、检查dll库的有效性
1)编译出来dll,发现少了lib,这个简单。直接添加一个.def,项目创建后会自动引用,这样编译就会出现.lib
2)使用,发现还是有问题,无法解析的外部符号
(1)明明编译出来了,lib和dll,还是这样!其实对于库敏感的程序员,这个库是不是没有导出啊,怎么大小才2KB
(2)我们来看看lib导出函数符号都有哪些吧
可以看看,空空如也。
(3)原因是没有导出任何函数,加上宏定义event_EXPORTS导出
(4)再次编译结果
此时函数链接符号就全部打印出来了
五、编译支持SSL的libevent库
上一步,我们在编译错误提示的第七步,排除了bufferevent_openssl.c文件,这次我们添加回来
报错:bufferevent_openssl.c(66): fatal error C1083: 无法打开包括文件: “openssl/bio.h”: No such file or directory
OpenSSL库编译也很麻烦,这里就直接安装exe文件
把include lib文件引入即可
至此就编译出支持OpenSSL的libevent库了