GLFW初始化报错:libdecor-gtk无法初始化GTK问题求助
GLFW初始化时libdecor-gtk插件加载失败问题排查
问题背景
搭建bgfx测试项目时,GLFW初始化阶段出现libdecor-gtk-WARNING: Failed to initialize GTK及Failed to load plugin 'libdecor-gtk.so': failed to init警告,程序虽能执行到退出,但窗口装饰相关功能存在异常。重装系统并升级内核至6.10.0-3-Manjaro后问题消失,需明确问题成因及通用解决办法。
测试代码
#include <bgfx/bgfx.h> #include <GLFW/glfw3.h> #include <iostream> #define WINDOW_WIDTH 1920 #define WINDOW_HEIGHT 1080 int main(int argc, char const *argv[]) { std::cout << "Initializing GLFW\n"; glfwInit(); std::cout << "Creating window\n"; GLFWwindow *window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Hello World", NULL, NULL); std::cout << "Initializing bgfx\n"; bgfx::init(); std::cout << "Exiting" << std::endl; return 0; }
编译运行命令及输出
执行命令
cmake . && make && valgrind --leak-check=full --log-file="yay.log" ./BGFX_Testing
输出日志
-- Configuring done (0.0s) -- Generating done (0.0s) -- Build files have been written to: /home/entropy/CLionProjects/BGFX_Testing [ 50%] Building CXX object CMakeFiles/BGFX_Testing.dir/main.cpp.o [100%] Linking CXX executable BGFX_Testing [100%] Built target BGFX_Testing Initializing GLFW libdecor-gtk-WARNING: Failed to initialize GTK Failed to load plugin 'libdecor-gtk.so': failed to init Creating window Initializing bgfx Exiting
系统信息
- 原问题发生时内核:6.6.34-1-MANJARO
- CPU:AMD Ryzen 7 5700X (16) @ 3.400GHz
- GPU:AMD ATI Radeon RX6700XT
已尝试的无效方案
- 重新安装libdecor:
sudo pacman -S libdecor - 检查libdecor-gtk.so依赖:
ldd /usr/lib/libdecor-gtk.so(所有依赖已安装) - 单独/同时安装glfw-x11和glfw-wayland
问题成因分析
- 内核与libdecor兼容性bug:6.6.x系列Manjaro内核可能存在与Wayland/X11窗口装饰框架libdecor的适配问题,导致GTK后端初始化失败。升级至6.10.x内核后问题消失,说明新内核修复了相关兼容性缺陷。
- 桌面环境后端冲突:Manjaro默认可能使用Wayland会话,而libdecor-gtk插件在Wayland环境下的GTK初始化逻辑存在异常,或与当前桌面环境的GTK版本不匹配。
- libdecor插件加载逻辑问题:libdecor尝试加载gtk插件时,未正确处理GTK初始化失败的情况,导致警告抛出,但不影响程序核心流程。
通用解决办法
- 升级内核到稳定新版本:直接升级至6.10+系列内核(或当前Manjaro推荐的稳定内核),修复底层兼容性问题。
- 强制GLFW使用X11后端:在
glfwInit()前添加窗口提示,指定使用X11平台,绕过Wayland下的libdecor-gtk问题:glfwWindowHint(GLFW_PLATFORM, GLFW_X11); glfwInit(); - 更新libdecor及GTK依赖:执行全系统更新,确保所有组件版本匹配:
sudo pacman -Syu libdecor gtk3 - 临时禁用libdecor-gtk插件:通过环境变量让libdecor跳过gtk插件加载,使用默认窗口装饰:
或在代码中设置环境变量:export LIBDECOR_PLUGINS="" ./BGFX_Testingsetenv("LIBDECOR_PLUGINS", "", 1); glfwInit();
内容的提问来源于stack exchange,提问作者Entropy
相关产品推荐
相关产品推荐

