[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.zyan.cc/libevent_windows/]

  本文介绍了如何在 Windows 操作系统中,利用微软 Visual Studio 2005 编译生成 Libevent 2.0.10 静态链接库,并利用 Libevent 静态链接库,实现一个简单的 HTTP Web服务器程序:httpd.exe。

  假设 Visual Studio 2005 的安装路径为“D:\Program Files\Microsoft Visual Studio 8\”,Libevent 2.0.10 解压后的路径为“D:\libevent-2.0.10-stable”。



  一、编译生成 Libevent 2.0.10 静态链接库。
  
  1、修改“D:\libevent-2.0.10-stable\event_iocp.c”、“D:\libevent-2.0.10-stable\evthread_win32.c”、“D:\libevent-2.0.10-stable\listener.c”三个文件,在文件开头分别加上一行:
#define _WIN32_WINNT 0x0500


  2、鼠标点击Windows左下角的【开始】-【所有程序】,找到【Microsoft Visual Studio 2005】,执行下图中的脚本:

  点击在新窗口中浏览此图片


  3、按照下图中的方法编译Libevent 2.0.10:

  点击在新窗口中浏览此图片


  4、生成的“libevent.lib”、“libevent_core.lib”、“libevent_extras.lib”三个文件就是我们需要的 Libevent 静态链接库。

  点击在新窗口中浏览此图片



  二、利用 Libevent 静态链接库,实现一个简单的 HTTP Web服务器程序

  1、打开 Visual Studio 2005,新建一个项目

  点击在新窗口中浏览此图片


  2、选择在“d:\test”目录内创建一个“Win32 控制台应用程序”

  点击在新窗口中浏览此图片


  3、按照下图进行选择

  点击在新窗口中浏览此图片


  4、创建完成项目后,会自动生成“d:\test\httpd\”目录,在该目录内创建一个“httpd.c”文件,内容如下:


  5、回到 Visual Studio 2005,在左侧的【源文件】中选择【添加】-【现有项】,将上一步创建的“httpd.c”文件添加进来。

  点击在新窗口中浏览此图片


  6、在【解决方案“httpd”】上点击鼠标右键,选择【属性】

  点击在新窗口中浏览此图片


  7、将【配置】改为“Release”

  点击在新窗口中浏览此图片


  8、将“D:\libevent-2.0.10-stable\include”整个目录复制到“D:\test\httpd\include”;将“D:\libevent-2.0.10-stable\WIN32-Code”目录内的“tree.h”文件和“event2”子目录,复制到“D:\test\httpd\include\”内;将“D:\libevent-2.0.10-stable\”目录内的所有“*.h”头文件复制到“D:\test\httpd\include\”内。可以在Windows左下角的【开始】-【运行】中输入“cmd”回车,在命令行窗口中执行以下命令,完成复制过程。
mkdir D:\test\httpd\include\
xcopy /E /H /R D:\libevent-2.0.10-stable\include\* D:\test\httpd\include\
xcopy /E /H /R D:\libevent-2.0.10-stable\WIN32-Code\* D:\test\httpd\include\
xcopy /E /H /R D:\libevent-2.0.10-stable\*.h D:\test\httpd\include\


  点击在新窗口中浏览此图片

  点击在新窗口中浏览此图片


  9、回到 Visual Studio 2005,在左侧菜单中【解决方案“httpd”】下面一行【httpd】上点击鼠标邮件,选择【属性】,对每项内容进行修改。下图中红框内的数据即为修改后的数据。

  点击在新窗口中浏览此图片

  点击在新窗口中浏览此图片

  点击在新窗口中浏览此图片

  点击在新窗口中浏览此图片


  注:下图中,附加依赖项填写:
ws2_32.lib wsock32.lib libevent.lib libevent_core.lib libevent_extras.lib

  忽略特定库填写:
libc.lib;msvcrt.lib;libcd.lib;libcmtd.lib;msvcrtd.lib

  点击在新窗口中浏览此图片


  10、完成设置后,在【解决方案“httpd”】上点击鼠标右键,选择【生成解决方案】。如果是重新编译,可以选择【重新生成解决方案】。生成成功后,“d:\test\httpd\Release”目录内的“httpd.exe”即为生成的可执行文件。

  点击在新窗口中浏览此图片


  11、双击“httpd.exe”运行后,打开浏览器,访问“http://127.0.0.1:8505/”,则可以看到以下信息:一个简单的 HTTP Web Server 输出的内容。

  点击在新窗口中浏览此图片


  12、如果你觉得像DOS程序一样的“httpd.exe”可执行文件图标不好看、没有显示版本信息,那么,你可以按照下图步骤,添加ICO图标文件。

  点击在新窗口中浏览此图片

  点击在新窗口中浏览此图片


  13、添加版本信息

  点击在新窗口中浏览此图片

  点击在新窗口中浏览此图片


  14、大功告成,下面显示的是带有自定义图标、版本信息的“httpd.exe”可执行程序。

  点击在新窗口中浏览此图片



  附1:编译好的 Libevent 2.0.10 静态链接库与 httpd 的 Visual Studio 2005 工程源代码下载


  附2:ICO图标制作工具下载






技术大类 » Windows相关 | 评论(53) | 引用(0) | 阅读(83918)
kernel
2011-3-30 09:32
沙发
Wendal Email Homepage
2011-3-30 09:33
还真不是一般的复杂

不过,借问一句,这种Http服务器,能干些什么吗? 单单是为了演示libevent的使用?
张宴 回复于 2011-3-30 09:46
能够在此基础上,开发一些基于HTTP协议的应用。
ccne
2011-3-30 11:03
用PYTHON不是更简单?
niniwzw
2011-3-31 11:45
张老师问你几个问题:ws2_32.lib wsock32.lib 这两个库有什么差别。我用了 ws2_32.lib  这一个库,就能链接成功。
还有,为什么要忽略 libc.lib;msvcrt.lib;libcd.lib;libcmtd.lib;msvcrtd.lib 这些库呢?是什么原因。
张宴 回复于 2011-3-31 14:28
wsock32.lib 是winsock1.0的库文件,ws2_32.lib 是winsock2.0的库文件,如果你只用winsock2,只要ws2_32.lib就可以了。

我们使用的是静态链接库多线程 (libcmt.lib),这样将一个httpd.exe文件拷贝到别的电脑上也能运行,不需要msvcrt.lib(msvcm80.dll、msvcp80.dll、msvcr80.dl)l等动态链接库的支持。libcmt.lib会和msvcrt.lib发生冲突,需要二者选其一。所以,按照微软MSDN上“链接器工具警告 LNK4098”的说明,忽略了这些库:
http://msdn.microsoft.com/zh-cn/library/6wtdswk0(v=VS.80).aspx
niniwzw
2011-3-31 11:55
张老师有空研究研究2.0的代码。写几篇博客,给我们参考参考。
liexusong Email
2011-3-31 14:08
libevent在win下是使用select的, 一点优势都没有~
张宴 回复于 2011-3-31 14:32
Libevent 最新的 2.0.10 版本已经支持了Windows 的 IOCP 网络模型。只不过 evhttp 部分还用的是 select。
泥水匠
2011-4-1 09:47
你好!
请问如果不做网络应用,能否把ws2_32.lib wsock32.lib这两个依赖库去掉?
火麒麟 Email Homepage
2011-4-1 10:30
初来乍到,先不知道说点什么,就留下一个臭臭的脚丫
宁波LED Email Homepage
2011-4-1 11:03
好复杂哦,来支持一下博主把。
agile Email Homepage
2011-4-1 22:20
C很强大。
www.zhuna5.com住哪 Email Homepage
2011-4-3 21:07
好好复杂啊
停牌 Homepage
2011-4-4 12:20
恩~!学习啦~
coach outletwristlet Email Homepage
2011-4-5 16:30
太复杂了  有简单一点的不?
美女艳图 Email Homepage
2011-4-5 21:22
grin学习一下,不断进步。
coach factoryoutletsale Email Homepage
2011-4-6 18:43
向老师学习了!
sevencat
2011-4-8 16:28
http://blog.vckbase.com/Files/BastEt/libeventsdk.zip
编译了一个动态库,应该是所有的vc编译器上都可以用。
激光脱毛 Email Homepage
2011-6-24 10:08
可以转载嘛
E7
2011-8-26 02:04
好文,windows可以编译成动态库不?然后貌似linux下又只能编译成动态库。。。
幸福慢点走
2011-9-4 00:11
libevent-2.0.13-stable.tar.gz  用vs2003命令行编译,出了这个问题。拜托哪位给个解。
===========================
cd test
  nmake /F Makefile.nmake
  cl /I.. /I../WIN32-Code /I../include /I../compat /DWIN32 /DHAVE_CONFIG_H /DTINYTEST_LOCAL /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib regress.obj regress_buffer.obj regress_http.obj regress_dns.obj  regress_testutils.obj  regress_rpc.obj regress.gen.obj  regress_et.obj regress_bufferevent.obj  regress_listener.obj regress_util.obj tinytest.obj  regress_main.obj regress_minheap.obj regress_iocp.obj  regress_thread.obj
regress_thread.obj : error LNK2019: 无法解析的外部符号 __beginthreadex ,该符号在函数 _thread_basic 中被引用
libevent.lib(event_iocp.obj) : error LNK2019: 无法解析的外部符号 __beginthread ,该符号在函数 _event_iocp_port_launch 中被引用
regress.exe : fatal error LNK1120: 2 个无法解析的外部命令
quilts Email Homepage
2011-10-7 12:13
好复杂,只有慢慢来了
分页: 1/3 第一页 1 2 3 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]