2017-07-17 109 views
5

Próbuję uruchomić moją aplikację Qt na innym komputerze (działa ona idealnie na mojej, w której ją opracowałem). Kiedy zacznę tę aplikację za pośrednictwem terminala, otrzymuję ten błąd -Błąd XCB: 148 - Problemy z wyświetlaniem aplikacji Qt

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

Mój program zostanie uruchomiony i wszystko wygląda ok, ale gdy uruchomię go widzę dziwne zachowanie podczas interakcji z wyświetlaczem (niektóre polecenia farby są niezrealizowany, co jest kluczowe dla mojej aplikacji).

Próbowałem wyszukać ten błąd i nie mogę znaleźć żadnego rozwiązania do tej pory. Masz jakieś sugestie?

Ubuntu 16.04, z Nvidia 1050 GTX

+0

Przeciwko jakiej biblioteki Qt jesteś łączącej w pliku pro? – Jeka

+0

Czy sprawdziłeś swoje wdrożenie http://doc.qt.io/qt-5/linux-deployment.html? – Jeka

+0

Łączenie z lXi lX11 lGL lglut lGLU lpython2.7 – JLev

Odpowiedz

3

Ty opracowany grafiki związane aplikację. Twoja aplikacja jest funkcjonalnie zależna od pliku xorg.conf (plik konfiguracyjny serwera X). X serwer to okna wyświetlacza, które opierają się na twoim sprzęcie do wyświetlania grafiki.

Podczas próby uruchomienia na tym samym komputerze tej samej aplikacji, użytkownik chce przeczytać tę samą konfigurację, którą miał na starym komputerze. Ponieważ każdy komputer ma plik xconf.org znajdujący się w /etc/x11/xconf.org. Na nowym komputerze komputer może czytać informacje z xconf.org, ale nie może odczytać wszystkich informacji. Dlatego częściowo działa.

Twoja karta graficzna ulepsza twój serwer X. Tak więc konfiguracja stale dodaje na twoim xconf.org na podstawie instalacji sterownika karty graficznej. Ale komputer bez karty graficznej ma także xconf.org do wyświetlania.

Poniżej znajduje się FSM dla połączenia z serwerem X (maszyna skończonego stanu). W twoim przypadku występuje _xcb_out happening - ponieważ coś wyświetla. Ale właściwe _xcb_in (wejście XCB) lub _xcb_ext (rozszerzenie XCB) nie jest poprawne.

Nie mogę dokładnie powiedzieć, co powoduje ten błąd. Ale FSM jest zaawansowaną maszyną, opartą na różnych kontekstach w różny sposób. Przeszukują kanały plików konfiguracyjnych, aby zakończyć konfigurację połączenia XCB. W twoim przypadku połączenie XCB zawiera błąd, więc konfiguracja XCB nie może się zdarzyć.

enter image description here

W każdym wyświetlacza serwera X, na pierwszym, istnieje potrzeba, aby zakończyć połączenie z serwerem X i po wystąpieniu, że dalsze przetwarzanie.

Spójrz na poniższy kod z Wikipedii: 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; 
} 

Oto link, który można badać więcej: https://xcb.freedesktop.org/tutorial/

Więc, co jest rozwiązaniem tutaj? QT domyślnie używa dynamicznego łączenia podczas kompilacji. Jeśli korzystasz z łączenia statycznego, pakiet wykonywany zawiera wszystkie biblioteki niezbędne do uruchomienia, a zatem w dowolnym miejscu, które chcesz uruchomić, możesz uruchomić. Tak więc, na starym komputerze, kompiluj używając statycznego linkowania. Tworzy coś w rodzaju pakietów takich jak tar. Musisz zainstalować ten program na swoim komputerze. Powinien działać.

QT, domyślnie wykorzystuje dynamiczne łączenie: Does Qt creator by default statically or dynamically link it's libraries?

Jak można zmienić QT do linkowania statycznego:How to make Qt and Qtcreator link the libraries statically instead of dynamic?