2017-07-17 18 views
5

Tôi đang cố gắng chạy ứng dụng Qt của mình trên một máy tính khác (nó hoạt động hoàn hảo trên máy tính của tôi, nơi tôi đã phát triển nó). Khi tôi bắt đầu ứng dụng này thông qua các thiết bị đầu cuối, tôi nhận được lỗi này -Lỗi XCB: 148 - Vấn đề hiển thị ứng dụng Qt

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

chương trình của tôi không khởi động và tất cả mọi thứ trông ok, nhưng khi tôi chạy nó tôi thấy hành vi kỳ lạ khi tương tác với màn hình (một số lệnh sơn là không được thực thi, điều này rất quan trọng đối với ứng dụng của tôi).

Tôi đã thử tìm kiếm lỗi này và tôi không thể tìm thấy bất kỳ giải pháp nào cho đến thời điểm này. Bạn có đề nghị nào không?

Sử dụng ubuntu 16.04, với Nvidia 1050 GTX gpu

+0

Against mà thư viện Qt bạn đang liên kết trong tập tin chuyên nghiệp của bạn? – Jeka

+0

Và bạn đã kiểm tra triển khai của mình http://doc.qt.io/qt-5/linux-deployment.html? – Jeka

+0

Liên kết tới lXi lX11 lGL lglut lGLU lpython2.7 – JLev

Trả lời

3

Bạn phát triển đồ họa ứng dụng liên quan. Ứng dụng của bạn phụ thuộc vào chức năng trong tệp xorg.conf của bạn (tệp cấu hình máy chủ X). Máy chủ X là cửa sổ hiển thị của bạn, dựa trên phần cứng đồ họa hiển thị của bạn.

Khi bạn cố gắng chạy trong máy tính khác cùng một ứng dụng, nó muốn đọc cùng một cấu hình mà bạn có trên máy tính cũ của mình. Vì mỗi máy tính có tệp xconf.org nằm trong /etc/x11/xconf.org. Có trên máy tính mới, máy tính có thể đọc thông tin từ xconf.org, nhưng nó không thể đọc tất cả thông tin. Đó là lý do tại sao nó hoạt động một phần.

Thẻ đồ họa của bạn tăng cường máy chủ X của bạn. Vì vậy, cấu hình tiếp tục thêm vào xconf.org của bạn dựa trên bạn cài đặt trình điều khiển đồ họa. Tuy nhiên, máy tính không có card đồ họa cũng có xconf.org để hiển thị.

Có FSM cho kết nối máy chủ X (Máy trạng thái hữu hạn) bên dưới. Trong trường hợp của bạn, có _xcb_out xảy ra - bởi vì nó đang hiển thị một cái gì đó. Nhưng, _xcb_in (XCB Input) hoặc _xcb_ext (XCB Extension) thích hợp là không chính xác.

Tôi không thể nói chính xác, điều này gây ra lỗi này. Tuy nhiên, FSM là máy tiên tiến, dựa trên các bối cảnh khác nhau theo những cách khác nhau. Họ tìm kiếm các kênh của các tệp cấu hình để hoàn thành thiết lập kết nối XCB. Trong trường hợp của bạn kết nối XCB có lỗi, do đó, XCB thiết lập không thể xảy ra.

enter image description here

Trong mỗi màn hình máy chủ X, tại đầu tiên, có cần phải hoàn thành kết nối X server và sau đó tiếp tục xử lý xảy ra.

Nhìn vào mã bên dưới từ Wikipedia: 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; 
} 

Dưới đây là liên kết mà bạn có thể nghiên cứu thêm: https://xcb.freedesktop.org/tutorial/

Vì vậy, giải pháp là gì đây? QT, theo mặc định, sử dụng liên kết động trong khi biên dịch. Nếu bạn sử dụng liên kết tĩnh sau đó, gói thực thi giữ tất cả các thư viện cần thiết để chạy, và do đó, bất cứ nơi nào, bạn muốn chạy, bạn có thể chạy. Vì vậy, trong máy cũ của bạn, biên dịch bằng cách sử dụng liên kết tĩnh. Nó tạo ra một cái gì đó gói như tar. Bạn phải cài đặt tar đó vào máy tính khác. Nó sẽ chạy.

QT, theo mặc định, sử dụng liên kết động: Does Qt creator by default statically or dynamically link it's libraries?

Làm thế nào bạn có thể thay đổi QT để liên kết tĩnh:How to make Qt and Qtcreator link the libraries statically instead of dynamic?

Các vấn đề liên quan