为什么Linux平台CMake官方二进制包存在libgtk3-nocsd依赖?
问题解答
你观测到的libgtk3-nocsd.so.0依赖并非Kitware官方发布的CMake 3.21.3二进制的原生编译依赖,完全是本地系统环境注入的结果,具体原因如下:
- 首先可以通过
readelf命令直接查看CMake二进制本身声明的强制依赖,执行readelf -d $(which cmake) | grep NEEDED,输出结果中不会包含任何和libgtk3相关的条目,即可证明该依赖不属于CMake本身。 - 该依赖的来源是Linux动态链接器的预加载机制:Debian、Ubuntu等主流桌面发行版如果安装了
gtk3-nocsd软件包,会默认在/etc/ld.so.preload配置文件或者LD_PRELOAD全局环境变量中添加该库的预加载规则。这个库的作用是全局Hook GTK3的相关调用,禁用GTK3默认的客户端装饰(CSD)效果,提升传统桌面环境的体验。所有启动的进程都会被强制注入这个库,哪怕进程本身完全不使用GTK框架,ldd命令会将预加载的库也纳入依赖列表展示,才会让你误以为CMake依赖该库。 - 你提到的librt依赖确实和CMake内嵌的
cmlibuv库有关,libuv在Linux环境下实现异步IO、高精度计时器、进程间通信等能力时需要调用librt提供的系统接口,属于正常的原生依赖。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

