uWebsockets 编译安装
前言
最近由于项目需要用到 websocket 所以看了一下 C++ 实现的 websocket 协议。在 Github 中找到了 uWebSockets,uWebSockets 最新版以 C++ 17 实现了 websocket 协议,目前拥有 13.7k starts,在 C++ 中是主流 websocket 实现。我在编译安装这个库上还是花了挺多时间了,在这里记录一下我的编译安装过程。
环境设置
uWebSockets 以纯头文件的形式用 C++ 17 实现,repo 中的示例还用到了 C++ 20 的特性,所以最好需要支持 C++ 20 的编译器版本(我用的是 gcc-9.20)。
在实验室的服务器上尝试编译时遇到了 lto1: fatal error: bytecode stream in file ‘uSockets/gcd.o’ generated with GCC compiler older than 10.0 compilation terminated
的错误,看起来是编译器 ABI 兼容性问题。可能是因为我装了多个不同版本的 gcc 同时环境变量的设置也比较混乱,尝试了各种升级版本和设置环境变量均无果后转而在新装的虚拟机(Ubutun 20.04)中编译安装了。在编译时最好确保编译环境“干净简洁”。
步骤
uWebSockets 能做到纯头文件实现是因为它底层依赖了 uSockets,uSockets 封装了各种网络操作。根据编译选项的不同需要安装好它的各种依赖项比如 openssl、libuv、zlib 等。
克隆 uWebSockets 到本地
git clone https://github.com/uNetworking/uWebSockets
克隆 uSockets 到 uWebSockets 中
项目克隆下来之后会发现里面的 uSockets 文件夹是空的,所以需要删掉该文件夹然后克隆 uSockets 到项目中。
cd uWebSockets
rm -rf uSockets
git clone https://github.com/uNetworking/uSockets
开启 ssl 选项编译
WITH_OPENSSL=1 make
安装
注意到 uWebSockets 的 Makefile 中有写 install 命令,执行 make install
后会在 /usr/local/include/
下新建一个 uWebSockets
文件夹然后将 src 下的所有 .h 文件拷贝到其中。这时候还不算全部安装成功,前面提到 uWebSockets 依赖了 uSockets,所以我们需要安装好 uSockets。
经过前面的 make 编译后来到 uSockets 文件夹,发现其中多出了各种 .o 目标文件和一个 .a 静态链接库(其实这个 .a 就是多出的各个 .o 的集合,可以用 readelf -A uSockets.a
查看)。uSockets 的 Makefile 中没有写好 install 命令,所以我们手动把 src 下的 libuSockets.h
和编译出来的 uSockets.a 静态链接库安装到系统目录下:libuSockets.h
需要拷贝到 /usr/local/include
下,uSockets.a
需要拷贝到 /usr/lib/x86_64-linux-gnu
下然后重命名为 libuSockets.a
链接
使用 uWebSockets 写完程序后编译时需要手动链接依赖的库文件。
-lz -lpthread -luSockets -lssl -lcrypto
websocket-demo
这是一个关于如何使用 uWebsockets 来实现一个支持发布和订阅的 websocket 服务器 demo,代码在这里。
有两个线程,主线程监听 ip: port 等待 websockets 客户端连接,客户端会在它发送到服务器的消息中指明要订阅的 topic,另一个线程(publishtopicrandom)模拟 topic 发布,如果某个 topic 已经由特定的客户端订阅,那么在服务端发布该 topic 时与该 topic 相关的消息将自动被发送到相应的客户端。mutex 和 condition_variable 用于同步两个线程,只有在客户端订阅后,线程 publishTopicRandomly 才会随机发布主题。
参考
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!