libuv的学习与链接库问题:error while loading shared libraries: libuv.so.1

来源:互联网 发布:淘宝达人个人优势简述 编辑:程序博客网 时间:2024/05/29 19:16

最近学习了一下另一个网络库:libuv,一个文档少,开始令人一头雾水,然后还是很好用的一个库。当然学习该库最重要的原则就是------去看“uv.h”头文件,里面有你想知道的一切。

1. 改了uv_book中的一个例子代码如下:

a.下面的是client

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdlib.h>#include <uv.h>#include <cstring>uv_loop_t *loop;uv_tcp_t *client;void alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf);void do_read();void do_write();void echo_write(uv_write_t *req, int status);void echo_read(uv_stream_t *client_, ssize_t nread, const uv_buf_t* buf) ;void on_connection(uv_connect_t* req, int status);void alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) {    *buf = uv_buf_init((char*) malloc(suggested_size), suggested_size);}void do_read(){    int r = uv_read_start((uv_stream_t*) client, alloc_buffer, echo_read);      if(r<0)    {        fprintf(stderr, "Read error %s\n", uv_err_name(r));        uv_close((uv_handle_t*)client, NULL);    }}void do_write(){    uv_write_t *req_write = (uv_write_t *) malloc(sizeof(uv_write_t));      char *line = (char*)malloc(1024*sizeof(char));    memset(line, 0, 1024);    int len = 0;    while (gets(line))    {      for(; len<1024; len++)      {          if(line[len] == 0)              break;      }      break;    }    uv_buf_t *buf = (uv_buf_t*)malloc(sizeof(uv_buf_t));    uv_buf_init(line, len+1);    buf->base = line;    buf->len = len+1;    req_write->data = (void*) buf->base;    int r = uv_write(req_write, (uv_stream_t*)client, buf, 1, echo_write);    if(r<0)    {        fprintf(stderr, "write error %s\n", uv_err_name(r));        uv_close((uv_handle_t*)client, NULL);    }}void echo_write(uv_write_t *req, int status){    if (status < 0) {        fprintf(stderr, "Write error %s\n", uv_err_name(status));    }    char *base = (char*) req->data;    free(base);    free(req);    do_write();}void echo_read(uv_stream_t *client_, ssize_t nread, const uv_buf_t* buf){    if (nread < 0) {        if (nread == UV_EOF){            fprintf(stderr, "UV_EOF....\n");        }else{            fprintf(stderr, "Read error %s : %s\n", uv_err_name(nread), uv_strerror(nread));        }        uv_close((uv_handle_t*) client_, NULL);        return;    }else{        printf("%s\n", buf->base);    }    do_read();}void on_connection(uv_connect_t* req, int status) {    if (status < 0) {        // error!        fprintf(stderr, "connect error %s : %s\n", uv_err_name(status), uv_strerror(status));        return;    }    free(req);    do_read();    do_write();}int main() {    loop = uv_default_loop();    client = (uv_tcp_t *)malloc(sizeof(uv_tcp_t));    uv_tcp_init(loop, client);    struct sockaddr_in bind_addr;    uv_ip4_addr("127.0.0.1", 7000, &bind_addr);    uv_connect_t *req = (uv_connect_t *)malloc(sizeof(uv_connect_t));    int r = uv_tcp_connect(req, client, (const sockaddr*)&bind_addr, on_connection);    if (r) {        fprintf(stderr, "connect error %s\n", uv_err_name(r));        return 1;    }    return uv_run(loop, UV_RUN_DEFAULT);}
b.下面的是server

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <uv.h>uv_loop_t *loop;void alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) {    *buf = uv_buf_init((char*) malloc(suggested_size), suggested_size);}void echo_write(uv_write_t *req, int status) {    if (status < 0) {        fprintf(stderr, "Write error %s\n", uv_err_name(status));    }    char *base = (char*) req->data;    free(base);    free(req);}void echo_read(uv_stream_t *client, ssize_t nread, const uv_buf_t* buf) {    if (nread < 0) {        if (nread == UV_EOF){            fprintf(stderr, "UV_EOF....\n");        }else{            fprintf(stderr, "Read error %s : %s\n", uv_err_name(nread), uv_strerror(nread));        }        uv_close((uv_handle_t*) client, NULL);        return;    }    printf("%s\n", buf->base);    uv_write_t *req = (uv_write_t *) malloc(sizeof(uv_write_t));    //alloc write watcher    req->data = (void*) buf->base;    uv_write(req, client, buf, 1, echo_write);}void on_new_connection(uv_stream_t *server, int status) {    printf("enter on_new_connection...\n");    if (status == -1) {        // error!        return;    }    uv_tcp_t *client = (uv_tcp_t*) malloc(sizeof(uv_tcp_t));    uv_tcp_init(loop, client);    if (uv_accept(server, (uv_stream_t*) client) == 0) {        int r = uv_read_start((uv_stream_t*) client, alloc_buffer, echo_read);          if(r<0)        {            fprintf(stderr, "Read error %s\n", uv_err_name(r));            uv_close((uv_handle_t*)client, NULL);        }    }    else {        uv_close((uv_handle_t*) client, NULL);    }}int main() {    loop = uv_default_loop();    uv_tcp_t server;    uv_tcp_init(loop, &server);    struct sockaddr_in bind_addr;    uv_ip4_addr("0.0.0.0", 7000, &bind_addr);    uv_tcp_bind(&server, (const sockaddr*)&bind_addr, 0);    //0--ipv4; 1--ipv6    int r = uv_listen((uv_stream_t*) &server, 128, on_new_connection);    if (r) {        fprintf(stderr, "Listen error %s\n", uv_err_name(r));        return 1;    }    return uv_run(loop, UV_RUN_DEFAULT);}

注:所有回调函数的格式在“uv.h”中都能找到。先执行server,再执行client。


2. 用的libuv的版本是libuv-v1.9.1,编译程序完毕后,执行的时候出现如下错误:

------------error while loading shared libraries: libuv.so.1: cannot open shared object file : No such file---------------

用 “ldd” 查看需要的库时,的确 “libuv.so.1” 说未被发现,可是查看 “/usr/local/bin” 明明是存在该库的。


------------------------------------------------------------------解决办法----------------------------------------------------------------

3. <方法1> 执行 “ldconfig” 命令,该命令可让动态链接库为系统所共享。发生错误的原因就是安装libuv库后,没有更新系统链接库名字列表,导致系统找不到该库。

    <方法2> 编译的时候指定动态链接库链接路径, 用gcc编译时,添加 “-Wl,-rpath=动态库路径”即可。

2 0
原创粉丝点击