libuv编译
起因
因为硬盘空间不足,要删除一部分不怎么用的文件,在删除一些源码文件的时候,看到libuv的时候,突然想起原先学习socket的时候,编译libuv一直没成功.于是把libuv源码删除.从官网下载一份.早期编译不通过的原因.是因为libuv依赖gyp,是通过gyp进行构建项目的.所以很多博客讲Windows下编译libuv还是需要的gyp的.现在libuv的已经不需要gyp.在Windows下可以通过CMake进行vs解决方案的构建.
源码下载: https://dist.libuv.org/dist/ ,进行选择版本下载.
GitHub地址: https://github.com/libuv/libuv
libuv是什么
libuv是跨平台的异步I/O事件库.最初为NodeJS编写.早期的Asp.Net Core也使用该库.这里借用官方文档中的图:
1.Windows下使用CMake构建解决方案
这里以https://dist.libuv.org/dist/v1.38.1/libuv-v1.38.1.tar.gz ,解压之后.查看目录结构:
CMake选择源码目录
CMake生成解决方案
通过打开libuv.sln解决方案进行编译.剩下的就是选择解决方案下的工程,进行右键生成.
2. 通过新建工程,添加libuv的源码进行编译
先新建筛选器.按照下图构造.根据筛选器目录结构,在工程文件所在的目录,新建一样的文件夹目录.分别将头文件和源码文件放入对应的文件夹中.直接编译工程是无法通过的.
进行属性配置:
重新编译,发现找不到uv-common.h头文件.
在一番查找之后,发现该文件在src目录中.在附加目录中添加该目录.
在次进行编译,发现有函数不安全:
在属性→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;
}
秋风
2020-08-08