解决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的一个用户,教程这种东西并不是百试百灵,每个人的环境都有差异,一种教程不一定能通吃,如果别人买了你的解决方案,发现没有解决,你不会觉得羞愧吗。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构