libuv编译

起因

因为硬盘空间不足,要删除一部分不怎么用的文件,在删除一些源码文件的时候,看到libuv的时候,突然想起原先学习socket的时候,编译libuv一直没成功.于是把libuv源码删除.从官网下载一份.

早期编译不通过的原因.是因为libuv依赖gyp,是通过gyp进行构建项目的.所以很多博客讲Windows下编译libuv还是需要的gyp的.现在libuv的已经不需要gyp.在Windows下可以通过CMake进行vs解决方案的构建.

源码下载: https://dist.libuv.org/dist/   ,进行选择版本下载.


libuv是什么

libuv是跨平台的异步I/O事件库.最初为NodeJS编写.早期的Asp.Net Core也使用该库.这里借用官方文档中的图:
libuv架构图

1.Windows下使用CMake构建解决方案

这里以https://dist.libuv.org/dist/v1.38.1/libuv-v1.38.1.tar.gz ,解压之后.查看目录结构:
libuv的目录结构
CMake选择源码目录
cmake选择libuv源码目录
CMake生成解决方案
cmake构建libuv的解决方案
通过打开libuv.sln解决方案进行编译.剩下的就是选择解决方案下的工程,进行右键生成.

2. 通过新建工程,添加libuv的源码进行编译

先新建筛选器.按照下图构造.
新建libuv的筛选器目录
根据筛选器目录结构,在工程文件所在的目录,新建一样的文件夹目录.分别将头文件和源码文件放入对应的文件夹中.直接编译工程是无法通过的.
找不到uv头文件
进行属性配置:
在工程属性中,添加libuv的头文件目录
重新编译,发现找不到uv-common.h头文件.
重新编译,找不到uv-common.h头文件
在一番查找之后,发现该文件在src目录中.在附加目录中添加该目录.
添加uv-common.h所在的目录
在次进行编译,发现有函数不安全:
发现使用不安全的函数
在属性→c/c++→预处理器定义.
增加预处理定义
_CRT_NONSTDC_NO_DEPRECATE
_CRT_SECURE_NO_WARNINGS
继续进行编译.发现缺少链接库,在下方代码中进行提供:
无法解析的外部符号
其实到这一步,基本上快完成编译,找不到外部解析的符号定义,就是缺少链接库.
下面主要看看libuv的hello world示例.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//需要的头文件
#include "uv.h"  

//需要的链接的静态库
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "kernel32.lib")  
#pragma comment(lib, "psapi.lib")  
#pragma comment(lib, "userenv.lib")

int main(int argc, char* argv[])
{
	uv_loop_t* loop = malloc(sizeof(uv_loop_t));
	uv_loop_init(loop);

	printf("Now quitting.\n");
	uv_run(loop, UV_RUN_DEFAULT);

	uv_loop_close(loop);
	free(loop);

	system("pause");

	return 0;
}

运行libuv的hello world示例

秋风 2020-08-08