c libev未定义对“ev#u default#u loop'”的引用;
我正在ubuntu上运行gcc编译器我正在使用一个示例来学习如何使用libev进行套接字连接我已经安装了libev4和libev dev,但是除了添加struct ev_loop*loop=ev_default_loop(0)外,其他一切都很好;它抛出了一个未定义的引用错误。任何人都能告诉我哪里出了问题吗?这是我的代码c libev未定义对“ev#u default#u loop'”的引用;,c,libev,C,Libev,我正在ubuntu上运行gcc编译器我正在使用一个示例来学习如何使用libev进行套接字连接我已经安装了libev4和libev dev,但是除了添加struct ev_loop*loop=ev_default_loop(0)外,其他一切都很好;它抛出了一个未定义的引用错误。任何人都能告诉我哪里出了问题吗?这是我的代码 #include <stdio.h> #include <netinet/in.h> #include <ev.h> #define POR
#include <stdio.h>
#include <netinet/in.h>
#include <ev.h>
#define PORT_NO 3033
#define BUFFER_SIZE 1024
int total_clients = 0; // Total number of connected clients
void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents);
void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents);
int main() {
struct ev_loop *loop = ev_default_loop(0); <--error-->
int sd;
struct sockaddr_in addr;
int addr_len = sizeof(addr);
struct ev_io w_accept;
// Create server socket
if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket error");
return (-1);
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT_NO);
addr.sin_addr.s_addr = INADDR_ANY;
// Bind socket to address
if (bind(sd, (struct sockaddr*) &addr, sizeof(addr)) != 0) {
perror("bind error");
}
// Start listing on the socket
if (listen(sd, 2) < 0) {
perror("listen error");
return (-1);
}
// Initialize and start a watcher to accepts client requests
ev_io_init(&w_accept, accept_cb, sd, EV_READ);
ev_io_start(loop, &w_accept); <-- error -->
// Start infinite loop
while (1) {
ev_loop(loop, 0);
}
return (0);
}
/* Accept client requests */
void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) {
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int client_sd;
struct ev_io *w_client = (struct ev_io*) malloc(sizeof(struct ev_io));
if (EV_ERROR & revents) {
perror("got invalid event");
return;
}
// Accept client request
client_sd = accept(watcher->fd, (struct sockaddr *) &client_addr,
&client_len);
if (client_sd < 0) {
perror("accept error");
return;
}
total_clients++; // Increment total_clients count
printf("Successfully connected with client.\n");
printf("%d client(s) connected.\n", total_clients);
// Initialize and start watcher to read client requests
ev_io_init(w_client, read_cb, client_sd, EV_READ);
ev_io_start(loop, w_client); <--error-->
}
/* Read client message */
void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) {
char buffer[BUFFER_SIZE];
ssize_t read;
if (EV_ERROR & revents) {
perror("got invalid event");
return;
}
// Receive message from client socket
read = recv(watcher->fd, buffer, BUFFER_SIZE, 0);
if (read < 0) {
perror("read error");
return;
}
if (read == 0) {
// Stop and free watchet if client socket is closing
ev_io_stop(loop, watcher); <--error-->
free(watcher);
perror("peer might closing");
total_clients--; // Decrement total_clients count
printf("%d client(s) connected.\n", total_clients);
return;
} else {
printf("message:%s\n", buffer);
}
// Send message bach to the client
send(watcher->fd, buffer, read, 0);
bzero(buffer, read);
}
#包括
#包括
#包括
#定义端口号3033
#定义缓冲区大小1024
int total_clients=0;//已连接客户端的总数
void accept_cb(结构ev_循环*循环,结构ev_io*观察者,int revents);
void read_cb(结构ev_循环*循环,结构ev_io*观察者,int revents);
int main(){
struct ev_loop*loop=ev_default_loop(0);
国际标准差;
地址中的结构sockaddr\u;
int addr_len=sizeof(addr);
结构ev_io w_accept;
//创建服务器套接字
if((sd=socket(PF_INET,SOCK_STREAM,0))<0){
perror(“套接字错误”);
返回(-1);
}
bzero(地址和地址,sizeof(地址));
addr.sin_family=AF_INET;
地址sin\u端口=htons(端口号);
addr.sin\u addr.s\u addr=INADDR\u ANY;
//将套接字绑定到地址
如果(绑定(sd,(结构sockaddr*)和地址,sizeof(地址))!=0){
perror(“绑定错误”);
}
//开始在套接字上列出
如果(听(sd,2)<0){
perror(“侦听错误”);
返回(-1);
}
//初始化并启动监视程序以接受客户端请求
ev_io_init(&w_accept,accept_cb,sd,ev_READ);
ev_io_启动(循环和w_接受);
//开始无限循环
而(1){
ev_回路(回路,0);
}
返回(0);
}
/*接受客户端请求*/
void accept_cb(结构ev_循环*循环,结构ev_io*观察者,int revents){
客户端地址中的结构sockaddr\u;
socklen\u t client\u len=sizeof(client\u addr);
国际客户服务部;
struct ev_io*w_client=(struct ev_io*)malloc(sizeof(struct ev_io));
如果(EV_错误和预防){
perror(“获得无效事件”);
返回;
}
//接受客户请求
client\u sd=accept(watcher->fd,(struct sockaddr*)和client\u addr,
&客户(本地);;
如果(客户_sd<0){
perror(“接受错误”);
返回;
}
total_clients++;//递增total_clients计数
printf(“已成功连接到客户端。\n”);
printf(“%d个客户端已连接。\n”,总共\u个客户端);
//初始化并启动watcher以读取客户端请求
ev_io_init(w_客户端、读取cb、客户端sd、ev_读取);
ev_io_启动(环路,w_客户端);
}
/*读取客户端消息*/
无效读取cb(结构ev_循环*循环,结构ev_io*观察程序,int revents){
字符缓冲区[缓冲区大小];
阅读;
如果(EV_错误和预防){
perror(“获得无效事件”);
返回;
}
//从客户端套接字接收消息
read=recv(watcher->fd,buffer,buffer\u SIZE,0);
如果(读取<0){
perror(“读取错误”);
返回;
}
如果(读==0){
//如果客户端套接字正在关闭,请停止并释放watchet
ev_io_停止(回路、观察者);
自由(观察者);
perror(“同行可能关闭”);
total_clients--;//递减total_clients计数
printf(“%d个客户端已连接。\n”,总共\u个客户端);
返回;
}否则{
printf(“消息:%s\n”,缓冲区);
}
//向客户端发送消息bach
发送(观察者->fd,缓冲区,读取,0);
bzero(缓冲区,读取);
}
我发现了我标记的多个错误。有人能告诉我出了什么问题吗?我做了很多搜索,但没有找到任何东西。代码看起来没有问题,但我怀疑你不喜欢libev。将
-lev
添加到编译器行:
gcc -o ev_test ev_test.c -lev
代码看起来没什么问题,但我怀疑你不喜欢libev。将
-lev
添加到编译器行:
gcc -o ev_test ev_test.c -lev
我不是Eclipse专家,但您应该能够在project/build设置下添加库。我不是Eclipse专家,但您应该能够在project/build设置下添加库。