官方介绍libnsq是nsq的c库,尼玛还真是c库,如果用g++编译还真编译不过。这篇文章就是说一下怎么在c++中使用libnsq。

为什么用g++编译不过libnsq呢,因为其头文件中默认全是c函数,没有对c++编译器做处理。

为了保持libnsq的完整性,不对libnsq代码作任何修改。

libnsq默认编译输出libnsq.a,个人不太喜欢使用静态库,所以自行编译为动态库:

gcc -o libnsq.so command.c http.c json.c message.c nsqd_connection.c nsqlookupd.c reader.c -fPIC -shared -lev -levbuffsock -lcurl -ljson-c

随后封装了c调研libnsq,代码如下

brd_nsq_consumer.h

#ifndef __BRD_NSQ_CONSUMER_H__
#define __BRD_NSQ_CONSUMER_H__
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*HANDLER)(const char *msg);
HANDLER callback; void init_nsq_consumer(const char *topic,const char *channel,const char *nsqlookupdDomain,int nsqlookupdPort,HANDLER handle); #ifdef __cplusplus
}
#endif
#endif

brd_nsq_consumer.c

#include "brd_nsq_consumer.h"
#include "nsq.h" void message_handler(struct NSQReader *rdr, struct NSQDConnection *conn, struct NSQMessage *msg, void *ctx); void init_nsq_consumer(const char *topic,const char *channel,const char *nsqlookupdDomain,int nsqlookupdPort,HANDLER handle)
{
callback = handle;
struct NSQReader *rdr;
struct ev_loop *loop;
void *ctx = NULL; //(void *)(new TestNsqMsgContext()); loop = ev_default_loop(0);
rdr = new_nsq_reader(loop, topic, channel, (void *)ctx,
NULL, NULL, NULL, message_handler); nsq_reader_connect_to_nsqd(rdr, "127.0.0.1", 4150);
//nsq_reader_add_nsqlookupd_endpoint(rdr, nsqlookupdDomain, 4161);
nsq_run(loop);
} void message_handler(struct NSQReader *rdr, struct NSQDConnection *conn, struct NSQMessage *msg, void *ctx)
{
if(callback!=NULL)
callback(msg->body);
buffer_reset(conn->command_buf); nsq_finish(conn->command_buf, msg->id); buffered_socket_write_buffer(conn->bs, conn->command_buf); buffer_reset(conn->command_buf);
nsq_ready(conn->command_buf, rdr->max_in_flight);
buffered_socket_write_buffer(conn->bs, conn->command_buf); free_nsq_message(msg);
}

编译:

gcc -shared -fPIC -o libnsqconsumer.so brd_nsq_consumer.c -lnsq

然后在c++中调用,代码如下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include "brd_nsq_consumer.h" class CMainModule
{
public:
CMainModule();
~CMainModule();
static void handler(const char *msg);
int procMSg(const char *msg);
}; static CMainModule *g_pModule; int main()
{
CMainModule *pModule = new CMainModule;
g_pModule=pModule; init_nsq_consumer("test","ch","127.0.0.1",4161,CMainModule::handler);
sleep(1000);
delete pModule;
} CMainModule::CMainModule(){ }
CMainModule::~CMainModule(){ }
void CMainModule::handler(const char *msg){
g_pModule->procMSg(msg);
}
int CMainModule::procMSg(const char *msg){
printf("====main=========%s\n",msg );
return 0;
}

编译:

g++ main.cpp -o a.out -lnsqconsumer -L./

libnsq编译、使用记录的更多相关文章

  1. mysql5.7.10 源码编译安装记录 (centos6.4)【转】

    一.准备工作 1.1 卸载系统自带mysql 查看系统是否自带MySQL, 如果有就卸载了, 卸载方式有两种yum, rpm, 这里通过yum卸载 rpm -qa | grep mysql //查看系 ...

  2. win10--vs2015--libjpeg--64位库的编译过程记录

    win10--vs2015--libjpeg--64位库的编译过程记录 1. 下载源代码:   http://libjpeg.sourceforge.net/    或者  http://www.ij ...

  3. maven ssm 编译异常记录:

    maven ssm 编译异常记录: javax.servlet.jsp 解决: 清除 tomacat libraries 修改 pom 文件 <dependency> <groupI ...

  4. OpenSift源代码编译过程记录

    本文记录了在CentOS6.5上编译Sift的开源实现OpenSift的编译过程,同一时候记录了编译过程中的几个问题. sift的理论已经有非常多了,以下会给出链接: 1.Requirements a ...

  5. 使用SSD目标检测c++接口编译问题解决记录

    本来SSD做测试的Python接口用起来也是比较方便的,但是如果部署集成的话,肯定要用c++环境,于是动手鼓捣了一下. 编译用的cmake,写的CMakeList.txt,期间碰到一些小问题,简单记录 ...

  6. day111:MoFang:邀请好友流程&生成邀请好友二维码&第三方应用识别二维码&本地编译测试&记录邀请人信息

    目录 1.邀请业务逻辑流程图 2.邀请好友-前端 3.邀请好友-后端接口(生成二维码) 4.前端获取后端生成的二维码 5.前端长按页面,保存图片到相册 6.客户端通过第三方识别微信二维码,服务端提供对 ...

  7. Unity 编译错误记录

    1. 相关代码: NetworkView.RPC ("ReceiveMessage", RPCMode.All, message); 编译输出: Assets/cs/ClientC ...

  8. openwrt编译出错处理记录

    1.代码从windows复制过来编译报错处理,参考:http://www.360doc.com/content/13/1016/21/3884271_321966616.shtml 2.编译lua-s ...

  9. C++ Qt 框架静态编译 操作记录

    谁愿意写个程式出来之后还附带一堆DLL,尤其是名字如此明显的名字. 于是在网上看了看,是需要下载源代码然后进行编译的,但是看了看别人说的编译时间,长达几个小时,瞬间就感觉不想做了.因为我还需要抓紧时间 ...

随机推荐

  1. 【转】Code First 属性详解

    下面解释每个配置的作用 Table :用于指定生成表的表名.架构信息. Column :用于指定生成数据表的列信息,如列名.数据类型.顺序等. Key :用于指定任何名称的属性作为主键列并且默认将此列 ...

  2. Linux定时计划(crontab)使用说明

    一.设置定时计划步骤 第一步,编缉计划文件:crontab -e 第二步,在文件中写入计划,格式如:minute hour day month week command.如0 8 * * * sh / ...

  3. windows工具打开命令

    程序 命令 位置 记事本 notepad C:\Windows\system32 ping ping C:\Windows\System32 服务管理器 services.msc C:\Windows ...

  4. MFC消息-自定义消息

    转:http://blog.csdn.net/penpenandtongtong/article/details/18598907 像MFC的窗口发送消息,可以进行自定义的动作行为,因此很多时候非常有 ...

  5. input text 在苹果微信浏览器中有上上阴影

    box-shadow:0px 0px 0px rgba(0,0,0,0); -webkit-appearance:none;

  6. elasticsearch在CentOS环境下开机启动

    验证环境,OS版本:CentOS-7-x86_64-Minimal-1708:ES版本:elasticsearch-6.2.2. 1.创建文件elasticsearch #!/bin/bash # # ...

  7. 变量和基本类型——复合类型,const限定符,处理类型

    一.复合类型 复合类型是指基于其他类型定义的类型.C++语言有几种复合类型,包括引用和指针. 1.引用 引用并非对象,它只是为一个已存在的对象所起的另外一个名字. 除了以下2种情况,其他所有引用的类型 ...

  8. [HDU3726]Graph and Queries

    Problem 给你一张图,点的权值,边和几个操作: D x: 删除第x条边 Q x y: 询问包含x的联通块中权值第y大的权值 C x y: 将x这个点的权值改为y Solution 一看就要离线处 ...

  9. 1.5 socket服务器传输文件

    socket服务器代码 # -*- coding: utf-8 -*-import sys,os,time,_thread from socket import * host = 'localhost ...

  10. python笔记3-输出输入、字符串格式化

    输入.输出 python怎么来接收用户输入呢,使用input函数,python2中使用raw_input,接收的是一个字符串,输出呢,第一个程序已经写的使用print,代码入下: 1 2 name=i ...