由于经常工作的环境基本上是在Windows系统上, 如果需要研发一些Linux桌面程序就必须安装虚拟机, 然后在虚拟机中研发。 由于平时工作使用docker较多, 想想能不能使用docker进行桌面程序研发呢
要想做到这个也不复杂, 毕竟Linux有大名鼎鼎的X Window System(也称X11或X)。
X Window System介绍:
X Window System(通常简称为 X11)是一个用于在 UNIX 和类 UNIX 系统上管理图形用户界面(GUI)的窗口系统。X11 是最常见的开源窗口系统,它提供了基本的绘图和用户交互功能,使得用户能够在图形环境中运行应用程序。
X11 是基于CS架构的窗口系统。在这个架构中,X Server负责处理图形显示和输入设备(如键盘、鼠标)的事件,而应用程序则作为X Client与 X Server通信。
X11 使用网络协议来处理客户端和服务器之间的通信,这使得 X 客户端可以在本地或远程机器上运行,并通过网络连接到 X 服务器
常见的X Server:
- X.Org Server: X.Org Server 是当前最常用的 X 服务器,也是 X Window System 的标准实现。它支持多种 UNIX 和类 UNIX 系统。
- Xephyr: Xephyr 是一个轻量级的 X 服务器
- Wayland: Wayland 是一个现代的显示服务器协议,替代了传统的 X Window System,但它仍然可以通过 XWayland 兼容层运行 X11 应用程序。
常见的X Client:
- Terminal Emulators: 如 GNOME Terminal、Konsole、Xterm 等,用于在图形界面中打开终端窗口。
- Window Managers: 如 GNOME Shell、KDE Plasma、i3、Openbox 等,用于管理窗口、布局和桌面环境。
- Text Editors:如 gedit、Vim、Emacs 等,用于编辑文本文件的图形界面应用程序。
前置条件
- docker
- VcXsrv
- vscode
环境搭建
-
首先在Windows上安装X Server, 笔者是安装的VcXsrv, 还有其他如Cygwin/X、Xming等。
-
Linux 环境搭建
拉取镜像:
docker pull ubuntu:22.04
启动容器:
docker run -itd -e DISPLAY=host.docker.internal:0.0 -v /c/xxx:/mnt/xxx --name qttest ubuntu:22.04 /bin/bash
关键是环境变量DISPLAY设置为宿主机ip及对应的参数。
参数
:0.0
表示x client应该在对应服务的x server的第几号server的第几号screen,.
间隔。 启动x server时可以看到该参数。安装ca-certificates:
apt update && apt install ca-certificates
更新为清华源: 打开ubuntu清华源, 找到对应版本替换到/etc/apt.source.list中, 记得备份。 最后
apt update
安装XCB:
Xlib 是一个常见的用于编写 X Client程序的库,它提供了一组函数和工具,使开发者可以方便地与 X Server通信。
XCB 库被设计为 Xlib 的替代品,XCB 提供了更好的性能和扩展性
apt install libxcb-*
-
QT环境安装
直接在清华镜像下载qt-unified-linux-x64-online.run在线安装包, 通过挂载目录复制到Linux下,执行安装。
安装过程中出现如下错误及解决办法:
error while loading shared libraries: libxkbcommon-x11.so.0: cannot open shared object file: No such file or directory
apt-get install libxkbcommon-x11-0
error while loading shared libraries: libxcb-xxx: cannot open shared object file: No such file or directory
apt install libxcb-*
error while loading shared libraries: libX11-xcb.so.1: cannot open shared object file: No such file or directory
apt install libx11-xcb1
error while loading shared libraries: libfreetype.so.6: cannot open shared object file: No such file or directory
apt install libfreetype6
error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory
apt install libfontconfig1
error while loading shared libraries: libdbus-1.so.3: cannot open shared object file: No such file or directory
apt-get install libdbus-1-3
-
vscode开始研发
vscode 安装微软研发的 docker 插件,然后在侧边栏的docker页选择容器进行附加。新建cmake项目, 设置QT依赖:
set(CMAKE_CXX_STANDARD 17)set(CMAKE_CXX_STANDARD_REQUIRED ON)set(CMAKE_AUTOUIC ON)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)list(APPEND CMAKE_PREFIX_PATH "/opt/Qt/5.15.2/gcc_64/lib/cmake" )find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets)file(GLOB SOURCES *.cpp *.cc *.hpp *.h) # GLOB_RECURSEset(CMAKE_INCLUDE_CURRENT_DIR ON)add_executable(${PROJECT_NAME} ${SOURCES})target_link_libraries(${PROJECT_NAME} Qt5::Widgets )
常见问题
-
Failed to find "GL/gl.h" in "/usr/include/libdrm"
apt install mesa-common-dev
Mesa 是一个开源的图形库,提供了 OpenGL 和 Vulkan 的实现
-
Could not load the Qt platform plugin "xcb"
apt install libxcb-*
参考链接
- X Window System介绍