2017-07-17 29 views
5

Qtアプリケーションを別のコンピュータで実行しようとしています(これは私が開発した場所で完全に動作します)。 私は端子を介してこのアプリケーションを起動すると、私はこのエラーを取得する -XCBエラー:148 - Qtアプリケーションの表示問題

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

私のプログラムが起動し、すべてがOKに見えるんが、私はそれを実行したときに表示と対話するとき、私は奇妙な行動を参照してください(一部塗装のコマンドがあります実行されていない、これは私のアプリにとって重要です)。

このエラーを検索しようとしましたが、これまでのところ解決策が見つかりませんでした。何か提案はありますか?

Nvidiaの1050 GTX GPUを搭載した、Ubuntuのに

+0

いるのQtのライブラリに対して? – Jeka

+0

あなたの展開をチェックしましたかhttp://doc.qt.io/qt-5/linux-deployment.html? – Jeka

+0

lXiにリンクする lX11 lGL lglut lGLU lpython2.7 – JLev

答えて

3

の16.04を使用してあなたは、アプリ関連のグラフィックスを開発しました。あなたのアプリケーションは、xorg.conf(Xサーバー構成ファイル)に機能的に依存しています。 Xサーバーは、ディスプレイグラフィックスハードウェアに基づいた表示ウィンドウです。

同じアプリを別のコンピュータで実行しようとすると、以前のコンピュータで使用していたのと同じ設定が読み込まれます。どのコンピュータもxconf.orgファイルは/etc/x11/xconf.orgにあります。新しいコンピュータには、xconf.orgから情報を読み取ることができますが、すべての情報を読むことはできません。それが部分的に働いている理由です。

あなたのグラフィックスカードがあなたのXサーバを拡張します。したがって、グラフィックスドライバをインストールしたことに基づいて、構成はxconf.orgに追加され続けます。しかし、グラフィックスカードを持たないコンピュータにもxconf.orgが表示されます。

下記のXサーバー接続(有限状態マシン)用のFSMがあります。あなたのケースでは、何かを表示しているので_xcb_outが起こっています。しかし、適切な_xcb_in(XCB入力)または_xcb_ext(XCB拡張)が正しくありません。

このエラーの原因は正確にはわかりません。しかし、FSMは、さまざまなコンテキストに基づいて、高度なマシンです。 XCB接続設定を完了するには、設定ファイルのチャネルを検索します。あなたのケースでは、XCB接続にエラーがあるため、XCBのセットアップは実行できません。すべてのXサーバディスプレイにおいて

enter image description here

、最初に、Xサーバ接続及びその更なる処理が発生した後に完了することが必要です。ウィキペディアからの以下のコードで

ルック:ここ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; 
} 

は、あなたがより多くを研究することができますリンクです:https://xcb.freedesktop.org/tutorial/

だから、ここソリューションは何ですか? QTは、デフォルトでコンパイル時にダイナミックリンクを使用します。静的なリンクを使用すると、実行可能パッケージには実行に必要なすべてのライブラリが保持され、実行したい場所で実行することができます。したがって、古いマシンでは、静的リンクを使用してコンパイルしてください。それはタールのような何かのパッケージを作り出します。あなたは別のコンピュータにそのtarをインストールする必要があります。実行する必要があります。

QTは、デフォルトでは、動的リンクを使用しています:あなたは静的リンクにQTを変更するにはどうすればよい 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?