解决ttyd编译时提示libwebsockets was not build with libuv support

0.环境介绍

以下操作过程均在 Raspbian(Ubuntu) 上进行,系统版本如下

pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster

1.尝试安装ttyd

sudo apt-get install build-essential cmake git libjson-c-dev libwebsockets-dev
git clone https://github.com/tsl0922/ttyd.git
cd ttyd && mkdir build && cd build
cmake ..
make && sudo make install

在步骤cmake ..中,CMake报错,错误信息为

pi@raspberrypi:~/src/ttyd/build $ cmake ..
CMake Error at CMakeLists.txt:66 (message):
  libwebsockets was not build with libuv support (-DLWS_WITH_LIBUV=ON)


-- Configuring incomplete, errors occurred!
See also "/home/pi/src/ttyd/build/CMakeFiles/CMakeOutput.log".
See also "/home/pi/src/ttyd/build/CMakeFiles/CMakeError.log".

根据提示,可以知道报错原因为系统安装的libwebsockets版本没有包含libuv,于是参考了其他人的做法,添加-DLWS_WITH_LIBUV重新编译libwebsockets

sudo apt-get remove libwebsockets-dev
git clone https://github.com/warmcat/libwebsockets.git
cd libwebsockets
mkdir build && cd build
cmake .. -DLWS_WITH_LIBUV=ON
make && sudo make install

然后再回到ttyd/build,执行cmake,依然报同样的错误。

2.排查问题

定位到出错的那一行cmake语句附近,找到一行

check_symbol_exists(LWS_WITH_LIBUV "lws_config.h" LWS_WITH_LIBUV)

这是检查 lws_config.h 头文件中是否含有符号LWS_WITH_LIBUV,那么lws_config.h在哪呢,在/usr/local/include目录中,手动查看后能确认LWS_WITH_LIBUV是存在的,那么就得怀疑是cmake的问题。
首次生成时cmake会生成一个CMakeCache.txt,以节约后续编译时分析环境所花费的时间,问题就出在这。我已经更新了lws_config.h的内容,但cmake仍然缓存着上次运行的结果,CMakeCache.txt中赫然写着

//Have symbol LWS_WITH_LIBUV
LWS_WITH_LIBUV:INTERNAL=

这里值是空的,代表OFF。check_symbol_exists每次只查询这里的内容,所以返回的结果是错误的。

3.解决问题

我删除了整个build文件夹,完全重新编译,问题解决

4.一些怨念

虽然文章写得轻描淡写,当时可是非常折磨人,为了解决问题不得不先把check_symbol_exists替换成set赋值语句,暂且通过编译,但运行时报找不到/usr/lib/libwebsockets.so.19,又得手动复制过去。总算跑起来了。这里diss一下csdn的一个用户,教程这种东西并不是百试百灵,每个人的环境都有差异,一种教程不一定能通吃,如果别人买了你的解决方案,发现没有解决,你不会觉得羞愧吗。

posted @ 2022-03-29 14:22  Melodic  阅读(397)  评论(1编辑  收藏  举报