2017-07-17 61 views
5

Qt uygulamamı farklı bir bilgisayarda çalıştırmaya çalışıyorum (geliştirdiğim yerde mükemmel bir şekilde çalışıyor). XCB hatası: 148 - Qt uygulama ekranı sorunları

QXcbConnection: XCB error: 148 (Unknown), sequence: 175, resource id: 0, major code: 140 (Unknown), minor code: 20

ekranla etkileşime geçerken Programım başlatmak vermez ve her şey Tamam görünüyor, ancak bunu çalıştırdığınızda ben garip davranışlar (bkz bazı boya komutları

- ı terminali aracılığıyla bu uygulamayı başlattığınızda , bu hatayı alıyorum uygulanmayan, benim uygulama için çok önemli olan).

Bu hatayı aramayı denedim ve şu ana kadar herhangi bir çözüm bulamıyorum. Önerin var mı?

Nvidia 1050 GTX gpu ile ubuntu

+0

Qt hangi kütüphanesi Karşı Eğer yanlısı dosyasında bağlantı veriyor? – Jeka

+0

Ve dağıtımınızı kontrol ettiniz http://doc.qt.io/qt-5/linux-deployment.html? – Jeka

+0

lXL lGL lGLU lpython2.7 – JLev

cevap

3

16.04 kullanma Uygulamayı ilgili grafikler geliştirdi. Uygulamanız, xorg.conf dosyanızın (X sunucu yapılandırma dosyası) işlevsel olarak bağımlı. X sunucusu, ekran grafik donanımınıza bağlı olan ekran pencerelerinizdir.

Farklı bir bilgisayarda aynı uygulamayı çalıştırmayı denediğinizde, eski bilgisayarınızda yaptığınız aynı yapılandırmayı okumak ister. Her bilgisayarda /etc/x11/xconf.org adresinde bulunan xconf.org dosyası bulunduğundan. Yeni bilgisayarda, bilgisayar xconf.org'dan bilgi okuyabilir, ancak tüm bilgileri okuyamaz. Bu yüzden kısmen çalışıyor.

Grafik kartınız X sunucunuzu geliştirir. Bu nedenle, grafik sürücüsünü kurmanıza bağlı olarak xconf.org adresinize yapılandırma eklemeye devam ediyor. Ancak, grafik kartı olmayan bilgisayarın da ekranı için xconf.org var.

Aşağıda X sunucu bağlantısı için FSM var (Sonlu Durum Makinesi). Senin durumunda, _xcb_out oluyor - çünkü bir şeyler gösteriyor. Ancak, doğru _xcb_in (XCB Input) veya _xcb_ext (XCB Extension) doğru değil.

Tam olarak söyleyemiyorum, bu hataya neden oluyor. Ancak, FSM, farklı içerik farklı şekillerde temel alan gelişmiş bir makinedir. XCB bağlantı kurulumunu tamamlamak için yapılandırma dosyalarının kanallarını ararlar. XCB bağlantısında bir hata var, bu yüzden XCB kurulumu gerçekleşemez. her X sunucusu ekranında

enter image description here

, ilk başta, orada X sunucu bağlantıyı tamamlamak için gereken ve daha fazla işlenmesi oluştuktan sonra. Wikipedia'dan aşağıdaki koda

Görünüş: Burada https://en.wikipedia.org/wiki/XCB

#include <xcb/xcb.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    xcb_connection_t *c; /* connection character */ 
    xcb_screen_t  *s; 
    xcb_window_t   w; 
    xcb_gcontext_t  g; 
    xcb_generic_event_t *e; 
    uint32_t    mask; 
    uint32_t    values[2]; 
    int     done = 0; 
    xcb_rectangle_t  r = { 20, 20, 60, 60 }; 

         /* open connection with the server */ 
    c = xcb_connect(NULL,NULL); 
    if (xcb_connection_has_error(c)) { 
    printf("Cannot open display\n"); 
    exit(1); /* you returned from here, no further processing */ 
    } 
         /* get the first screen */ 
    s = xcb_setup_roots_iterator(xcb_get_setup(c)).data; 

         /* create black graphics context */ 
    g = xcb_generate_id(c); 
    w = s->root; 
    mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES; 
    values[0] = s->black_pixel; 
    values[1] = 0; 
    xcb_create_gc(c, g, w, mask, values); 

         /* create window */ 
    w = xcb_generate_id(c); 
    mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; 
    values[0] = s->white_pixel; 
    values[1] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS; 
    xcb_create_window(c, s->root_depth, w, s->root, 
        10, 10, 100, 100, 1, 
        XCB_WINDOW_CLASS_INPUT_OUTPUT, s->root_visual, 
        mask, values); 

         /* map (show) the window */ 
    xcb_map_window(c, w); 

    xcb_flush(c); 

         /* event loop */ 
    while (!done && (e = xcb_wait_for_event(c))) { 
    switch (e->response_type & ~0x80) { 
    case XCB_EXPOSE: /* draw or redraw the window */ 
     xcb_poly_fill_rectangle(c, w, g, 1, &r); 
     xcb_flush(c); 
     break; 
    case XCB_KEY_PRESS: /* exit on key press */ 
     done = 1; 
     break; 
    } 
    free(e); 
    } 
         /* close connection to server */ 
    xcb_disconnect(c); 

    return 0; 
} 

olduğunu daha araştırma yapabilirsiniz linki: https://xcb.freedesktop.org/tutorial/

Peki, çözüm burada nedir? QT, varsayılan olarak, derlerken dinamik bağlantıyı kullanır. Statik bağlantı kullanırsanız, çalıştırılabilir paketi çalıştırmak için gerekli olan tüm kitaplıkları tutar ve böylece, istediğiniz her yerde, çalıştırmak istediğinizi çalıştırmak isteyebilirsiniz. Yani eski makinenizde statik bağlantı kullanarak derleyin. Katran gibi bir şey üretiyor. Bu katranı farklı bilgisayarınıza yüklemelisiniz. Koşmalı.

QT, varsayılan olarak, dinamik bağlama kullanır: Statik bağlanmasından QT değiştirebilir nasıl Does Qt creator by default statically or dynamically link it's libraries?

:How to make Qt and Qtcreator link the libraries statically instead of dynamic?