QXcbConnection:使用Qt5远程调试程序时无法连接显示

QXcbConnection: Could not connect to display, when remotely debugging program with Qt5

我在我的 PC 上为 BeagleBone Black 交叉编译了一个 GUI 应用程序,我可以在我的 BeagleBone 上成功执行它。
但是当我使用F5(菜单:调试->开始调试)远程调试应用程序时,我遇到了如下问题。

QXcbConnection: Could not connect to display

应用程序在 main() 行崩溃:

QApplication a(argc, argv);
  1. 以下是编译调试时的细节:

debug details:

Checking available ports...
Found 101 free ports.
Starting gdbserver...
Debugging starts

Listening on port 10001
Remote debugging from host 192.168.1.10
Process /home/debian/gdb/armtest3 created; pid = 13981
Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
Could not load shared library symbols for 25 libraries, e.g. /usr/lib/arm-linux-gnueabihf/libQt5Widgets.so.5.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
-----------------armtest3 start------------
QXcbConnection: Could not connect to display

compile output:

09:31:33: Running steps for project armtest3...
09:31:33: Configuration unchanged, skipping qmake step.
09:31:33: Starting: "/usr/bin/make" 
make: Nothing to be done for 'first'.
09:31:33: The process "/usr/bin/make" exited normally.
09:31:33: The remote file system has 218 megabytes of free space, going ahead.
09:31:33: Deploy step finished.
09:31:33: Trying to kill "/home/debian/gdb/armtest3" on remote device...
09:31:37: Remote application killed.
09:31:37: Deploy step finished.
09:31:37: No deployment action necessary. Skipping.
09:31:37: Deploy step finished.
09:31:37: Elapsed time: 00:04.
  1. 以下是我的BeagleBone Kit:
    BeagleBone Kit configuration

  2. main.c

main.c

#include "mainwindow.h"
#include <QApplication>
#include <iostream>
#include <QDateTime>
#include <QDebug>
using namespace std;

int main(int argc, char *argv[])
{
    cout << "-----------------armtest3 start------------" << endl;
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}  

相关问题:

当您在设备本身的 X11 系统中部署您的应用程序并 运行 它时,您会发现它可以工作,因为在这里它可以访问 DISPLAY 环境变量(简单地说) 告诉它在哪里显示自己。此环境变量已在您的 X 会话中进一步设置在进程树上。

当您通过调试器启动程序时,Qt Creator 正在连接到远程设备(通过您在 工具 > 选项 > 设备 中的设置)和 运行通过 ssh 连接程序。在这种情况下,您的程序不再知道在哪里显示自己,因为显然它不能在 ssh 中显示。它在您指定的线路上出错,因为这是 XCB 子系统试图确定为此目的连接到哪个 X-Server 的地方。

所以回答你的问题:远程调试时需要手动提供DISPLAY环境变量

一个简单的测试方法是转到 项目模式 ,找到您用于为远程设备构建的工具包,然后 select 运行 设置。在此之下,您应该找到一个 运行 Environment 部分。在这里您可以添加一个名为 DISPLAY 的新变量,并将其值设置为您 运行 正在使用的显示器的标识符(我猜您会想要 :0.0,表示第一个本地主机上的可用屏幕,尽管您应该阅读有关 DISPLAY 变量的信息,例如 here or here).

一个长期的、可能更好的解决方案是在您的套件设置中设置相同的变量(工具 > 选项 > 构建和 运行 > 套件 > 环境).这将适用于您使用它创建的未来程序。