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

时间:2018-06-11 15:25:28

标签: linux raspberry-pi qt5 beagleboneblack

  • PC:Debian 9.4.0,x64,ip 192.168.1.10
  • Qt:Qt Creator 4.6.1基于Qt5.11.0
  • BeagleBone Black:Debian 9.3.0,armv7,ip 192.168.1.20

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

  

QXcbConnection:无法连接到显示

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

QApplication a(argc, argv);
  1. 以下是编译和调试时的详细信息:
  2. 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套件:
      BeagleBone Kit configuration

    2. main.c

    3. 的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();
      }  
      

      相关问题:QXcbConnection: Could not connect to display, when trying to debug Linux app with Qt Creator

1 个答案:

答案 0 :(得分:2)

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

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

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

测试方法的一种简单方法是转到项目模式,找到用于为远程设备构建的工具包,然后选择运行设置。在此下,您应找到运行环境部分。在这里,您可以添加一个名为DISPLAY的新变量,并将其值设置为您正在运行的显示的标识符(我猜测您想要:0.0,表示第一个可用虽然您应该阅读有关DISPLAY变量的信息,例如herehere)。

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