libuv系列文章
libuv简介
libuv 是一个高性能的,事件驱动的I/O,并且支持多平台的网络库,比如Node.js、Luvit、Julia、pyuv等大型的软件都有使用它进行开发,这足以看出它的性能优越性。
其实高性能的网络库在github有非常多,比如libevent、libev、libhv等库,libevent、libev、libuv都是c语言实现的异步事件库、libhv是国内开发者使用C++实现的异步事件库,但是我还是选择了libuv,因为它足够强大,并且支持多平台,编程还非常方便简洁。
也可以看看下图的简单对比,主要是对比github上的star与fork(当前时间是 2020-4-17 星期五):
下载libuv
在linux系统下,可以通过git去拉取libuv的源码并且使用。
安装必要的依赖
ps:如果你系统中有就不用去安装了。
sudo apt-get -y install git automake libtool
拉取libuv源码
打开libuv的github仓库:https://github.com/libuv/libuv ,了解一下相关的说明信息,然后可以拉取下来:
git clone https://github.com/libuv/libuv.git
如果觉得太慢,可以从gitee下载:
git clone https://gitee.com/jiejieTop/libuv.git
切换到v1.36.0
版本分支,目前这个版本的分支是最新的。
git checkout v1.36.0
当然你要是留意看的话,里面还有227个 release 版本,你也可以通过wget或者浏览器去下载它们,它们的格式有zip、tar.gz等压缩格式,目前最新发布的release版本是v1.36.0
。
编译使用
其实如果单纯使用libuv的话,是非常简单的,直接在系统安装即可,但是我想编译一些其他的功能,比如libuv的一些说明文档、man手册等,那么就自己下载源码编译,首先进入libuv目录下,可以看到当前的分支是默认的分支——v1.x
,这其实是开发版本,最近这两天都有开发的,反正我们用就对了:
➜ libuv git:(v1.x) ls
AUTHORS configure.ac include m4 src
autogen.sh CONTRIBUTING.md libuv.pc.in MAINTAINERS.md SUPPORTED_PLATFORMS.md
ChangeLog docs LICENSE Makefile.am test
CMakeLists.txt img LICENSE-docs README.md tools
用autotools工具自动配置:
./autogen.sh
./configure
然后编译并安装:
make
sudo make install
ps:还有个检查的命令:make check,不过我在运行的过程中报错了,测试不通过,暂时别管他吧。。。
验证编译安装是否完成
在安装完成后,你可以看到在/usr/local/lib/
目录下有libuv的静态库、动态库等内容:
ls /usr/local/lib/
libuv.a libuv.la libuv.so libuv.so.1 libuv.so.1.0.0
在/usr/local/include/
目录下也有一个uv文件夹、还有一个uv.h头文件。
ls /usr/local/include/
uv uv.h
简单实用
随便写个代码,打印一下安装的libuv库的版本:
#include <stdio.h>
#include <stdlib.h>
#include <uv.h>
int main()
{
char *version;
version = (char*) uv_version_string();
printf("libuv version is %s\n", version);
return 0;
}
编写Makefile,指定编译的规则并且编译它,需要注意的是需要指定链接libuv库-luv
,这是动态链接的方式:
CC=gcc
SRC = $(wildcard *.c */*.c)
OBJS = $(patsubst %.c, %.o, $(SRC))
DEP_FILES := $(patsubst %, .%.d,$(OBJS))
DEP_FILES := $(wildcard $(DEP_FILES))
FLAG = -g -Werror -I. -Iinclude -lpthread -luv
TARGET = targets
$(TARGET):$(OBJS)
$(CC) -o $@ $^ $(FLAG)
ifneq ($(DEP_FILES),)
include $(DEP_FILES)
endif
%.o:%.c
$(CC) -o $@ -c $(FLAG) $< -g -MD -MF .$@.d
clean:
rm -rf $(TARGET) $(OBJS)
distclean:
rm -rf $(DEP_FILES)
.PHONY:clean
当编译完成后,可以看到产生的可执行文件,可以使用ldd命令去查看它的依赖,可以看到它依赖系统的/usr/local/lib/libuv.so.1
:
➜ 001 make
gcc -o demo.o -c -g -Werror -I. -Iinclude -lpthread -luv demo.c -g -MD -MF .demo.o.d
gcc -o targets demo.o -g -Werror -I. -Iinclude -lpthread -luv
➜ 001 ls
demo.c demo.o Makefile targets
➜ 001 ldd targets
linux-vdso.so.1 (0x00007fffa5bc6000)
libuv.so.1 => /usr/local/lib/libuv.so.1 (0x00007f8346e7b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8346a8a000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f8346882000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8346663000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f834645f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f83472ac000)
➜ 001
运行:
./targets
libuv version is 1.36.0