开源库evhtp在windows下编译

工作需要搭建基于C++的http服务,最后选择使用evhtp。在linux下的编译参考readme即可。现在重点来说下windows下的编译过程。

代码git地址:https://github.com/criticalstack/libevhtp

编译准备

  1. Visual Studio 必须  笔者用的是VS2019
  2. Libevent2库   必须  git地址:https://github.com/libevent/libevent,libevent的windows版本编译相对简单)
  3. CMake           必须  网上可下载,如果网上地址太慢。到 这里 下载
  4. OpenSSL       可选  网上下载,也可以通过源代码编译
  5. pthreads   可选   VS的插件管理里面安装
  6. onig(regex   可选   git地址:https://github.com/kkos/oniguruma

  说明:图中需要编译的库都会在源代码里面提供,必须具备 1 和 3

编译过程

按照原作者说明,采用cmake + “MSYS Makefiles“ 来进行编译,这种方式我尝试过,没有成功。最终采用”Visual Studio“的方式来编译。

  1. 打开代码根目录(包含CMakeLists.txt文件),创建build目录
  2. 通过DOS(或者其他SHELL工具)进入到代码目录,进入build目录
  3. 执行命令 cmake -DLIBEVENT_INCLUDE_DIR=..\package\include\libevent-2.1.11 -DONIGURUMA_INCLUDE_DIR=..\package\include\oniguruma-6.9.3 ..
  4. 看到提示显示创建失败,提示缺少 LIBEVENT_THREAD,这是因为libevent库编译windows版本时没有提供出这个库,具体原因未知..
  5. 转到根目录下的cmake文件夹下,打开options.cmake文件,将”option (EVHTP_DISABLE_EVTHR "Disable evthread support"     OFF)“ 这行的 OFF 改为 ON
  6. 继续执行步骤3代码,会提示一些错误,大概意思就时文件已经被包含过,不过不影响,现在我们查看build目录下,发现已经有了VS的项目文件libevhtp.sln
  7. 双击打开libevhtp.sln,选择evhtp这个工程进行编译,会提示如下信息:”无法解析的外部符号 __imp_bind,该符号在函数 evhtp_bind_sockaddr 中被引用“等信息,这是由于未配置windows下的WS2_32.Lib库,添加再配置项里添加这个依赖
  8. 重新编译发现生成发现没有报错,成功生成了evhtp.dll。但这里我发现另外个问题,没有对应的lib生成。
  9. 查看对应的接口定义,是由EVHTP_EXPORT这个宏导出,这个宏定义在build目录下的include下的config.h的文件中。在windows下,这个宏定义为空。

    #ifndef EVHTP_NEED_EXPORT
    # if (defined __GNUC__ && __GNUC__ >= 4) || defined __INTEL_COMPILER || defined __clang__
    #  define EVHTP_EXPORT __attribute__ ((visibility("default")))
    # else
    #  define EVHTP_EXPORT __declspec(dllimport)
    # endif
    #else
    # if (defined __GNUC__ && __GNUC__ >= 4) || defined __INTEL_COMPILER || defined __clang__
    #  define EVHTP_EXPORT
    # else
    #  define EVHTP_EXPORT __declspec(dllexport)
    # endif
    #endif

    修改后的config.h开头定义如下,重新定义一个是否导出的宏 EVHTP_NEED_EXPORT,将这宏放到预处理定义里,并删除原来的 EVHTP_EXPORT宏。重新编译后,包含evhtp.lib及evhtp.dll文件

结果测试

新建一个工程,利用evhtp库创建一个http服务器,看是否成功。代码如下:

 1 // main.cpp: 主程序入口
 2 //
 3 #include <iostream>
 4 #include "evhtp.h"
 5 #include <WinSock2.h>
 6
 7 evhtp_t* g_htp;
 8
 9 #define REGISTER_HTP_CB(path, cb, arg) evhtp_set_cb(g_htp, path, cb, arg)
10
11 void HtpCallBack(evhtp_request_t* req, void* a)
12 {
13     std::cout << "recv a command" << std::endl;
14     evhtp_headers_add_header(req->headers_out, evhtp_header_new("Content-Type", "application/json", 0, 0));
15     evbuffer_add(req->buffer_out, "hello, evhtp! success.", sizeof("hello, evhtp! success."));
16     evhtp_send_reply(req, EVHTP_RES_OK);
17 }
18
19 int main(int argc, const char* argv[])
20 {
21     WSADATA wsaData;
22     WSAStartup(MAKEWORD(1, 1), &wsaData);
23
24     evbase_t* evbase = event_base_new();
25     g_htp = evhtp_new(evbase, NULL);
26     evhtp_use_threads_wexit(g_htp, NULL, NULL, 16, NULL);
27
28     REGISTER_HTP_CB("/api", HtpCallBack, nullptr);
29
30     evhtp_bind_socket(g_htp, "0.0.0.0", 8080, 1024);
31
32     event_base_loop(evbase, 0);
33
34     WSACleanup();
35
36     return 0;
37 }

编译后,运行程序。提示 无法定位程序点输入点 evhtp_use_threads_wexit 。查找该函数定义在evhtp.c文件中,不过该函数是否编译由 EVHTP_DISABLE_EVTHR 宏来控制,在上面步骤5里面,我们将这个编译选型设置为ON,所以导致头文件中由接口定义,但是却没有实现。

修改build/include目录下的config文件中将 #define EVHTP_DISABLE_EVTHR代码注释掉,注意可能存在多行。重新编译我们的evhtp库,会提示找不到pthread.h找不到,将VS中NuGet找到pthread的库安装即可。

如果提示timespec重定义错误,在预处理宏中加上 HAVE_STRUCT_TIMESPEC 定义

编译成功运行工程,通过web页面发送请求,成功。通过ProcessExplorer工具查看,程序也是有17个线程。遇到过没编译好,只有一个线程情况。

总结

附上我编译后的源代码地址:https://github.com/kswangxing/evhtp_win

里面包含编译后代码。

编译环境:VS2019 64位

原文地址:https://www.cnblogs.com/kswangxing/p/11787478.html

时间: 2024-08-27 18:45:22

开源库evhtp在windows下编译的相关文章

libCURL开源库在VS2010环境下编译安装,配置详解

libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 CURL开源库VS2010环境下编译安装,配置详解 一 准备 1.1 CURL官网下载地址:http://curl.haxx.se/download.html 1.2 找到源码包,我这里下载的是7.32.0版:http://curl.haxx.se/download/curl-7.32.0.zip 二 步骤 2.1 打开curl-7.32.0\

Windows下编译LevelDB

Windows下编译LevelDB flyfish 2015-7-8 LevelDB是开源的存在磁盘上的key-value存储 由google的Jeffrey Dean 和Sanjay Ghemawat编写. 环境 操作系统:windows x64 编译器: VC2010 配置 需要Boost库支持,需要先将Boost库编译为64位版本 1文件->新建->从现有代码文件创建新项目 打开 从现有代码文件创建新项目 向导窗口 2要创建什么类型的项目? 选择Visual C++ 3项目文件位置 选择

Skia简介以及在Windows下编译操作步骤

Skia是一个C++的开源2D向量图形处理函数库(Cairo是一个矢量库),包括字型.坐标转换.位图等等,相当于轻量级的Cairo,目前主要用于Google的Android和Chrome平台,Skia搭配OpenGL/ES与特定的硬件特征,强化显示的效果.另外,Skia是WebKit支持的众多图形平台之一,在WebKit的GraphicsContext.h/.c中有相关实现. Android与Chrome的源代码库中都有一份Skia的复制,因需求不同,做了部分的修改. Skia需要的底层库有:f

Windows下编译安装 FFmpeg

在Linux/Mac下编译 ffmpeg是非常方便的.但要在 Windows下编译 ffmpeg还真要花点时间.以下就是在 Windowns下编译ffmpeg的步骤: 一.安装Cygwin 在windows下安装 ffmpeg 的最好方式就是使用Cygwin. Cygwin是什么呢?简单的说,就是在 Windows上装了一个Linux模拟器.然后你可以在这个模拟器上按照Linux的方式操作 Windows系统.因此,Windows安装了Cygwin之后,你就把它当Linux用就可以了. 既然在W

WIndows下编译libexif-0.6.21,生成VS下可用的dll和lib

1.下载libexif-0.6.21.zip 下载地址是http://sourceforge.net/projects/libexif/files/libexif/0.6.21/ 2.解压libexif-0.6.21.zip 我解压到了d:\opensources\下 3.安装Mingw 下载地址是http://www.mingw.org/ 点击右上角的Download Installer 记得安装Msys 我的安装路径是:C:\MinGW 下面依次有如下文件夹: bin include lib

在Windows下编译OpenSSL(VS2005和VC6)

需要说明的是请一定安装openssl-0.9.8a .  openssl-1.0.0我没有编译成功. 如何在Windows下编译OpenSSL (Vs2005使用Vc8的cl编译器)1.安装ActivePerl//初始化的时候,需要用到perl解释器2.使用VS2005下的Visual Studio 2005 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)3.解压缩openssl的包,进入openssl的目录4.perl configure VC-WIN32尽量在这

在Windows下编译WebRTC

前言这篇文章的目的在于为你节省生命中宝贵的10小时(甚至更多),或者浪费你10分钟.作为Google更新频繁的大型跨平台基础库,WebRTC的编译一直被人称为噩梦.如果恰巧你偏要在Windows下编译WebRTC,那么你最好提前对自己的耐心和智商做充分的评估.截止目前,我尝试过中文博客社区里几乎所有的文章,可以说全部失效了.我不知道这篇文章的有效期有多久,因为webrtc.org社区的家伙们更新实在太勤奋了!环境 OS:Microsoft Windows 7 Ultimate 6.1.7601

windows下编译配置libnet-1.2-rc3

官网:http://packetfactory.openwall.net/projects/libnet/ 下载(有zip和tar.gz两个版本):https://github.com/sam-github/libnet/releases 解压之后: 编译步骤: 将libnet-libnet-1.2-rc3复制到D盘 双击libnet目录下的msvcbuild.bat文件,之后就会在src目录下生成libnet.dll和libnet.lib ---------------------------

在Windows下编译FFmpeg详细说明

MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNC工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时 MinGW,即 Minimalist GNU For Windows.它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情况下使用 GCC产生 Windows32 程序. 开发 MinGW 是为了那些不喜欢工作在 Linux(FreeBSD) 操作系统而留在 Windows 的人提供一套符合 GNU 的 GNU 工作环境. 所以