1.Qt程序运行环境
- ubuntu 16.04
- Qt5.12.3
- Qt可执行程序
编译后运行Qt可执行程序后出现报错
报错内容:
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, xcb.
问题排查
因为pro文件中增加了jsoncpp的库依赖后,运行时才出现上述运行时的报错
LIBS += -L/usr/lib/x86_64-linux-gnu/ -ljsoncpp
因为代码中使用了第三方的json库,所以添加上面的该依赖之后才出现的问题。猜测jsoncpp的依赖不完整或者是库的平台版本(platform)不一致, 以及本身“xcb”Qt插件库依赖存在问题。
解决过程步骤
#查看测试程序的platform版本
file xxx可执行程序
#查看该库的platform版本
file /usr/lib/x86_64-linux-gnu/libjsoncpp.so.1.7.2
输出
RoutePlan: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux
2.6.32, BuildID[sha1]=6718b5a1cb4efa74ca5efd1cf8ab4d0bf8c5afc9, not stripped
/usr/lib/x86_64-linux-gnu/libjsoncpp.so.1.7.2: ELF 64-bit LSB shared object,
x86-64, version 1 (SYSV), dynamically linked,
BuildID[sha1]=6148d23fe92c8d73c2bc30ec2e01c89aa240a52d, stripped
可见可执行程序和该库的平台版本均为x86-64,所以平台版本一致问题排除。然后可以使用ldd -v
命令看下该第三方库的所有依赖树是否完整,注意加“-v”参数才能看到最完整的依赖树。
huanglidi@hld-vm:/usr/lib/x86_64-linux-gnu$ ldd -v libjsoncpp.so.1.7.2
linux-vdso.so.1 => (0x00007ffe965cc000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f572f213000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f572ef0a000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f572ecf4000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f572e92a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f572f7c6000)
Version information:
./libjsoncpp.so.1.7.2:
libgcc_s.so.1 (GCC_3.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
libm.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libm.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libstdc++.so.6 (GLIBCXX_3.4.9) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
libstdc++.so.6 (CXXABI_1.3) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
libstdc++.so.6 (GLIBCXX_3.4.11) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
libstdc++.so.6 (GLIBCXX_3.4.21) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
/usr/lib/x86_64-linux-gnu/libstdc++.so.6:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
libm.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libm.so.6
libgcc_s.so.1 (GCC_4.2.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
libgcc_s.so.1 (GCC_3.3) => /lib/x86_64-linux-gnu/libgcc_s.so.1
libgcc_s.so.1 (GCC_3.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.18) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libm.so.6:
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libgcc_s.so.1:
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
#libqxcb.so库依赖打印太多,这里就不post上来了,结果是库依赖是完整的
查看json库以及libqxcb.so
库的依赖库依赖都是完整的,因此猜测是库依赖的问题不成立。所以再回到报错信息Could not load the Qt platform plugin "xcb" in "" even though it was found.
上,这里的xcb库找到了但是无法加载,是不是可能存在两个xcb库,且刚好在LIBS += -L/usr/lib/x86_64-linux-gnu/
这个路径上!
sudo find / -name libqxcb*
[sudo] huanglidi 的密码:
/home/huanglidi/Qt5.12.3/Tools/QtCreator/lib/Qt/plugins/platforms/libqxcb.so
/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so
果然如此,程序的依赖库查到了一个不正确的xcb库上
最终解决方案:
问题解决!