Skip to main content

libuv 编译与安装

libuv 是一个高性能的,事件驱动的 I/O,并且支持多平台的网络库,接下来就手把手带你进入 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 星期五):

在 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

当然你要是留意看的话,里面还有 227release 版本,你也可以通过 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 *

当编译完成后,可以看到产生的可执行文件,可以使用 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