libevent编程error: expected specifier-qualifier-list before ‘TAILQ_ENTRY’···

leihelin5201314 2010-09-12 10:21:24
一个简单的libevent服务器···

错误提示:

/usr/local/include/evrpc.h:75: error: expected specifier-qualifier-list before ‘TAILQ_ENTRY’
/usr/local/include/evrpc.h:341: error: expected specifier-qualifier-list before ‘TAILQ_ENTRY’

貌似是文件库的这个evrpc.h头文件有什么问题····缺少什么东西里边好像,
请问下,怎么改?谢谢!



...全文
1520 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
landerchan 2011-12-13
  • 打赏
  • 举报
回复
TAILQ_ENTRY is defined in "sys/queue.h" already, so libevent decides to use that one if that is detected during the configure procedure. For your case, including "sys/queue.h" should be fine.
ninesunqian 2011-09-05
  • 打赏
  • 举报
回复
把 event.h 中 “#undef TAILQ_ENTRY” 注释掉就可以了。
nealkillyou 2011-04-22
  • 打赏
  • 举报
回复
经常遇到这种错误:

error: expected '=', ',', ';', 'asm' or '__attribute__' before
error: expected declaration specifiers or ‘...’ before
error: expected specifier-qualifier-list before
error: expected ‘)’ before

不懂啊 又不会改源文件
leihelin5201314 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 piaomiao12 的回复:]

/usr/local/include/evrpc.h:75: error: expected specifier-qualifier-list before ‘TAILQ_ENTRY’
/usr/local/include/evrpc.h:341: error: expected specifier-qualifier-list before ‘TAILQ_ENTRY’
时间什么

[/Quote]

请问下,缺少什么吗?
leihelin5201314 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 justkk 的回复:]

屏蔽这些头文件的包含
//#include <evhttp.h>
//#include <evutil.h>
//#include <evrpc.h>
//#include <event-config.h>

struct event *ev; //= arg
修改为struct event ev;

屏蔽掉你代码中mysql相关的代码后,在我的环境中是可以编译通过的..
g……
[/Quote]

编译后虽然有warning,蛋还是通过了···谢谢,我需要链接数据库之后向客户端发送数据,

非常感谢!!

运行后数据没传送过去···看来程序还得改···
piaomiao12 2010-09-13
  • 打赏
  • 举报
回复
/usr/local/include/evrpc.h:75: error: expected specifier-qualifier-list before ‘TAILQ_ENTRY’
/usr/local/include/evrpc.h:341: error: expected specifier-qualifier-list before ‘TAILQ_ENTRY’
时间什么
justkk 2010-09-13
  • 打赏
  • 举报
回复
屏蔽这些头文件的包含
//#include <evhttp.h>
//#include <evutil.h>
//#include <evrpc.h>
//#include <event-config.h>

struct event *ev; //= arg
修改为struct event ev;

屏蔽掉你代码中mysql相关的代码后,在我的环境中是可以编译通过的..
gcc yourfile.c -levent
leihelin5201314 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 justkk 的回复:]

不是说了嘛,TAILQ_ENTRY在event.h中定义的
[/Quote]
但是已经有event.h文件了···我把代码发出来吧···
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/errno.h> // for errno
#include <mysql/mysql.h>
#include <netinet/in.h> // for sockaddr_in

#include <event.h>

#include <evdns.h>
#include <evhttp.h>
#include <evutil.h>
#include <evrpc.h>
#include <event-config.h>

#define IPADDR "127.0.0.1"
#define PORT 7777

void sock_read(int server_socket, short event, void *arg)
{

struct event *ev = arg;
struct sockaddr addr;

char buffer[500];
MYSQL db;/*connector*/
MYSQL_RES * result;/*result buffer*/
MYSQL_ROW row;/*one row of the result*/

if(mysql_init(&db)==NULL)
{
fprintf(stderr,"Fail to initialize the db.\n");
exit(1);
}
char host[32] = "localhost";
char user[32] = "root";
char passwd[38] = "123456";
char dbc[32] = "mysql";
char getDate[1024];
char id[2000];
char s[2000];
memset(getDate,0,1024);
if (NULL == (mysql_real_connect(&db,host,user,passwd,dbc,0,NULL,0)))
{
fprintf(stderr,"Connect to mysql Error:%s!\n",mysql_error(&db));
exit(1);
}
char str[2000];char str1[2000];
char Where_SQL[1024]="SELECT d.user_id,u.email,d.domain,d.status,v.* FROM domain_vip_status AS v, domains AS d, users AS u WHERE d.id = v.domain_id AND u.id = d.user_id AND d.grade != 'Free' ORDER BY vip_ended_at, email ";

if(mysql_query(&db,Where_SQL)!= 0)
{
printf("mysql_query(&db,str)=%d\n",mysql_query(&db,str));
fprintf(stderr,"Fail to query the db for information.\n");
exit(1);
// return -1;
}
else
{
puts("Connect to mysql success!\n");
}

/*获得查询结果*/
if ((result = mysql_store_result(&db)) == NULL)
{
fprintf(stderr,"Fail to get the result.\n");
exit(1);
// return -1;
}
/*fetching each row*/
while((row=mysql_fetch_row(result))!=NULL)
{
puts("================================================");
printf("user_id: %s\n",row[0]);
printf("email: %s\n",row[1]);
printf("domain: %s\n",row[2]);
printf("status: %s\n",row[3]);
printf("domain_id: %s\n",row[4]);
printf("vip_started_at: %s\n",row[5]);
printf("vip_ended_at: %s\n",row[6]);
puts("================================================");

char m1[]="user_id:";char m2[]=" email:";char m3[]=" domain:";char m4[]=" status:";char m5[]=" domain_id:";char m6[]=" vip_started_at:";char m7[]=" vip_ended_at:";

memset(buffer,0,500);
sprintf(buffer,"%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n",m1,row[0],m2,row[1],m3,row[2],m4,row[3],m5,row[4],m6,row[5],m7,row[6]);
strcat(buffer,"\n"); //C语言字符串连接

int ss = send(server_socket,buffer,strlen(buffer),0); //*new_
printf("ss=%d\n",ss);
memset(buffer,0,500);
recv(server_socket,buffer,500,0);
printf("recv[%s]\n",buffer);
}
send(server_socket,"over",strlen("over"),0); //*new_
mysql_free_result(result);
mysql_close(&db);

event_add(ev, NULL);
}

static void sock_accept(int server_socket, short event, void *arg)
{
struct event *ev = arg;
struct sockaddr addr;
int s;
socklen_t len = sizeof(addr);
struct event *rev = (struct event *)malloc(sizeof(rev));//*rev

if((s = accept(server_socket, &addr, &len)) == -1)
{
fprintf(stderr, "Sock Accept Failed!\n");
exit(0);
}
event_set(rev, s, EV_READ, sock_read, rev); //EV_READ,short event
event_add(rev, NULL);
event_add(ev, NULL);
}
int main () //int argc, char **argv
{
struct event *ev; //= arg

int server_socket;
struct sockaddr_in addr;
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1)
{
perror("socket error\n");
exit(-1);
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr =htonl(INADDR_ANY); //INADDR_ANY;IPADDR
if (bind(server_socket,(struct sockaddr*)&addr, sizeof(addr)) == -1)
{
perror("bind error\n");
exit(-1);
}

if (listen(server_socket, 5) == -1)
{
perror("listen error\n");
exit(-1);
}
event_init();
event_set(&ev,server_socket,EV_READ,sock_accept,&ev); //186行
event_add(&ev, NULL); //189行
event_dispatch();
return (0);
}

错误提示:
/usr/local/include/evrpc.h:75: error: expected specifier-qualifier-list before ‘TAILQ_ENTRY’
/usr/local/include/evrpc.h:341: error: expected specifier-qualifier-list before ‘TAILQ_ENTRY’
11s.c: In function ‘main’:
11s.c:186: warning: passing argument 1 of ‘event_set’ from incompatible pointer type
/usr/local/include/event.h:542: note: expected ‘struct event *’ but argument is of type ‘struct event **’
11s.c:189: warning: passing argument 1 of ‘event_add’ from incompatible pointer type
/usr/local/include/event.h:607: note: expected ‘struct event *’ but argument is of type ‘struct event **’

怎么改阿···我都愁了一天了···
justkk 2010-09-13
  • 打赏
  • 举报
回复
不是说了嘛,TAILQ_ENTRY在event.h中定义的
leihelin5201314 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 justkk 的回复:]

你的环境中现在有event.h了吗?
TAILQ_ENTRY好像在event.h中定义的,你需要首先包含这个头文件吧..
[/Quote]

有event.h了,但是错误提示:
/usr/local/include/evrpc.h:75: error: expected specifier-qualifier-list before ‘TAILQ_ENTRY’

不是提示event.h头文件的,是另一个···


应该不是头文件的问题吧?···
justkk 2010-09-13
  • 打赏
  • 举报
回复
你的环境中现在有event.h了吗?
TAILQ_ENTRY好像在event.h中定义的,你需要首先包含这个头文件吧..
leihelin5201314 2010-09-12
  • 打赏
  • 举报
回复
`````自己up
leihelin5201314 2010-09-12
  • 打赏
  • 举报
回复
提示找不到这个文件或目录···
这个是我编译完linevent之后
再编译libevent简单服务器代码之后出现的问题,

下面这个是evrpc.h文件中部分内容:

struct evbuffer;
struct event_base;
struct evrpc_req_generic;

/* Encapsulates a request */
struct evrpc {
TAILQ_ENTRY(evrpc) next; //75行
···
···
struct evrpc_request_wrapper {
TAILQ_ENTRY(evrpc_request_wrapper) next; //341行
···
请问下怎么改?
Linux-Torvalds 2010-09-12
  • 打赏
  • 举报
回复
不是缺少东西的原因吧。查看一下那一行的前面。
cat /usr/local/include/evrpc.h:75 | grep 'TAILQ_ENTRY'
leihelin5201314 2010-09-12
  • 打赏
  • 举报
回复
`````自己up

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧