Qt na Raspberry Pi

0

Witam, probuje skompilowac Qt na malinie zgodnie z tym tutorialem: http://qt-project.org/wiki/Native_Build_of_Qt5_on_a_Raspberry_Pi, niestety podczas komendy 'make' otrzymuje blad:

/usr/bin/g++ -c -pipe -marm -mfpu=vfp -mtune=arm1176jzf-s -march=armv6zk -mabi=aapcs-linux -mfloat-abi=hard -O2 -fvisibility=hidden -fvisibility-inlines-hidden -std=c++0x -fno-exceptions -Wall -W -D_REENTRANT -fPIC -DQT_NO_MTDEV -DQT_NO_XKB -DXCB_USE_XLIB -DXCB_USE_XINPUT2 -DXCB_USE_RENDER -DXCB_USE_EGL -DSUPPORT_X11 -DXCB_USE_IBUS -DDFLT_XKB_CONFIG_ROOT=\"/usr/share/X11/xkb\" -DDEFAULT_XKB_RULES=\"evdev\" -DDEFAULT_XKB_MODEL=\"pc105\" -DDEFAULT_XKB_LAYOUT=\"us\" -DQ_FONTCONFIGDATABASE -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_PLUGIN -DQT_PLATFORMSUPPORT_LIB -DQT_DBUS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../../../../mkspecs/devices/linux-rasp-pi-g++ -I. -I../../../3rdparty/xkbcommon -I../../../3rdparty/xkbcommon/src -I../../../3rdparty/xkbcommon/src/xkbcomp -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I../../../../include -I../../../../include/QtPlatformSupport -I../../../../include/QtPlatformSupport/5.2.2 -I../../../../include/QtPlatformSupport/5.2.2/QtPlatformSupport -I../../../../include/QtGui/5.2.2 -I../../../../include/QtGui/5.2.2/QtGui -I../../../../include/QtDBus -I../../../../include/QtCore/5.2.2 -I../../../../include/QtCore/5.2.2/QtCore -I../../../../include/QtGui -I../../../../include/QtCore -I.moc -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -o .obj/qxcbclipboard.o qxcbclipboard.cpp
/usr/bin/g++ -c -pipe -marm -mfpu=vfp -mtune=arm1176jzf-s -march=armv6zk -mabi=aapcs-linux -mfloat-abi=hard -O2 -fvisibility=hidden -fvisibility-inlines-hidden -std=c++0x -fno-exceptions -Wall -W -D_REENTRANT -fPIC -DQT_NO_MTDEV -DQT_NO_XKB -DXCB_USE_XLIB -DXCB_USE_XINPUT2 -DXCB_USE_RENDER -DXCB_USE_EGL -DSUPPORT_X11 -DXCB_USE_IBUS -DDFLT_XKB_CONFIG_ROOT=\"/usr/share/X11/xkb\" -DDEFAULT_XKB_RULES=\"evdev\" -DDEFAULT_XKB_MODEL=\"pc105\" -DDEFAULT_XKB_LAYOUT=\"us\" -DQ_FONTCONFIGDATABASE -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_PLUGIN -DQT_PLATFORMSUPPORT_LIB -DQT_DBUS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../../../../mkspecs/devices/linux-rasp-pi-g++ -I. -I../../../3rdparty/xkbcommon -I../../../3rdparty/xkbcommon/src -I../../../3rdparty/xkbcommon/src/xkbcomp -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I../../../../include -I../../../../include/QtPlatformSupport -I../../../../include/QtPlatformSupport/5.2.2 -I../../../../include/QtPlatformSupport/5.2.2/QtPlatformSupport -I../../../../include/QtGui/5.2.2 -I../../../../include/QtGui/5.2.2/QtGui -I../../../../include/QtDBus -I../../../../include/QtCore/5.2.2 -I../../../../include/QtCore/5.2.2/QtCore -I../../../../include/QtGui -I../../../../include/QtCore -I.moc -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -o .obj/qxcbconnection.o qxcbconnection.cpp
qxcbconnection.cpp: In constructor ‘QXcbConnection::QXcbConnection(QXcbNativeInterface*, bool, const char*)’:
qxcbconnection.cpp:280:45: error: invalid conversion from ‘EGLNativeDisplayType {aka void*}’ to ‘Display* {aka _XDisplay*}’ [-fpermissive]
/usr/include/X11/Xlib-xcb.h:13:19: error:   initializing argument 1 of ‘xcb_connection_t* XGetXCBConnection(Display*)’ [-fpermissive]
qxcbconnection.cpp:281:51: error: invalid conversion from ‘EGLNativeDisplayType {aka void*}’ to ‘Display* {aka _XDisplay*}’ [-fpermissive]
/usr/include/X11/Xlib-xcb.h:16:6: error:   initializing argument 1 of ‘void XSetEventQueueOwner(Display*, XEventQueueOwner)’ [-fpermissive]
make[5]: *** [.obj/qxcbconnection.o] Błąd 1
make[5]: Opuszczenie katalogu `/home/pi/Qt5onPi/qt5/qtbase/src/plugins/platforms/xcb'
make[4]: *** [sub-xcb-plugin-pro-make_first-ordered] Błąd 2
make[4]: Opuszczenie katalogu `/home/pi/Qt5onPi/qt5/qtbase/src/plugins/platforms/xcb'
make[3]: *** [sub-xcb-make_first] Błąd 2
make[3]: Opuszczenie katalogu `/home/pi/Qt5onPi/qt5/qtbase/src/plugins/platforms'
make[2]: *** [sub-platforms-make_first] Błąd 2
make[2]: Opuszczenie katalogu `/home/pi/Qt5onPi/qt5/qtbase/src/plugins'
make[1]: *** [sub-plugins-make_first] Błąd 2
make[1]: Opuszczenie katalogu `/home/pi/Qt5onPi/qt5/qtbase/src'
make: *** [sub-src-make_first] Błąd 2

W sieci znalazłem, ze ludzie maja podobne problemy: http://qt-project.org/forums/viewthread/37355, lecz nie znalazłem rozwiazania :( Drodzy przyjaciele pomozcie mi, siedze nad tym 3 dzien i nie wiem jak rozwiazac ten problem. Z gory od razu dziekuje za pomoc :)

0

Znalazłem dwa linki, które mogę może w czymś pomóc:
-http://qt-project.org/forums/viewthread/24544
-https://bugs.launchpad.net/glmark2/+bug/1099153

Oby dwa linki sugerują błąd w źródłach eglplatform.h/eglvivante.h.

Przyjrzałem się dokładniej pliku Xlib-xcb.h, zawiera on jedynie deklarację 3 funkcji, dwie z nich właśnie wywala błąd niezgodności typów, deklaracja pliku:

/* Copyright (C) 2003-2006 Jamey Sharp, Josh Triplett
 * This file is licensed under the MIT license. See the file COPYING. */

#ifndef XLIB_XCB_H
#define XLIB_XCB_H

#include <xcb/xcb.h>
#include <X11/Xlib.h>

xcb_connection_t *XGetXCBConnection(Display *dpy);

enum XEventQueueOwner { XlibOwnsEventQueue = 0, XCBOwnsEventQueue };
void XSetEventQueueOwner(Display *dpy, enum XEventQueueOwner owner);

#endif /* XLIB_XCB_H */ 

Zajrzałem również do qxcbconnection.cpp (do interesującego mnie konstruktora):

QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, bool canGrabServer, const char *displayName)
    : m_connection(0)
    , m_canGrabServer(canGrabServer)
    , m_primaryScreen(0)
    , m_displayName(displayName ? QByteArray(displayName) : qgetenv("DISPLAY"))
    , m_nativeInterface(nativeInterface)
#ifdef XCB_USE_XINPUT2_MAEMO
    , m_xinputData(0)
#endif
    , xfixes_first_event(0)
    , xrandr_first_event(0)
    , xkb_first_event(0)
    , has_glx_extension(false)
    , has_shape_extension(false)
    , has_randr_extension(false)
    , has_input_shape(false)
    , has_touch_without_mouse_emulation(false)
    , has_xkb(false)
    , debug_xinput_devices(false)
    , debug_xinput(false)
    , m_buttons(0)
    , m_focusWindow(0)
    , m_systemTrayTracker(0)
{
#ifdef XCB_USE_EGL
    EGLNativeDisplayType dpy = EGL_DEFAULT_DISPLAY;
#elif defined(XCB_USE_XLIB)
    Display *dpy;
#endif
#ifdef XCB_USE_XLIB
    dpy = XOpenDisplay(m_displayName.constData());
    if (dpy) {
        m_primaryScreen = DefaultScreen(dpy);
        **m_connection = XGetXCBConnection(dpy);         // Tutaj wywala błąd:  invalid conversion from ‘EGLNativeDisplayType {aka void*}’ to ‘Display* {aka _XDisplay*}’
        XSetEventQueueOwner(dpy, XCBOwnsEventQueue);// Tutaj wywala błąd:  invalid conversion from ‘EGLNativeDisplayType {aka void*}’ to ‘Display* {aka _XDisplay*}’**
        XSetErrorHandler(nullErrorHandler);
        m_xlib_display = dpy;
    }
#else
    m_connection = xcb_connect(m_displayName.constData(), &m_primaryScreen);
#endif //XCB_USE_XLIB

    if (!m_connection || xcb_connection_has_error(m_connection))
        qFatal("QXcbConnection: Could not connect to display %s", m_displayName.constData());

#ifdef XCB_USE_EGL
    EGLDisplay eglDisplay = eglGetDisplay(dpy);
    m_egl_display = eglDisplay;
    EGLint major, minor;
    m_has_egl = eglInitialize(eglDisplay, &major, &minor);
#endif //XCB_USE_EGL

    m_reader = new QXcbEventReader(this);
    m_reader->start();

    xcb_extension_t *extensions[] = {
        &xcb_shm_id, &xcb_xfixes_id, &xcb_randr_id, &xcb_shape_id, &xcb_sync_id,
#ifndef QT_NO_XKB
        &xcb_xkb_id,
#endif
#ifdef XCB_USE_RENDER
        &xcb_render_id,
#endif
#ifdef XCB_HAS_XCB_GLX
        &xcb_glx_id,
#endif
        0
    };

    for (xcb_extension_t **ext_it = extensions; *ext_it; ++ext_it)
        xcb_prefetch_extension_data (m_connection, *ext_it);

    m_setup = xcb_get_setup(xcb_connection());

    initializeAllAtoms();

    m_time = XCB_CURRENT_TIME;
    m_netWmUserTime = XCB_CURRENT_TIME;

    initializeXRandr();
    updateScreens();

    m_connectionEventListener = xcb_generate_id(m_connection);
    xcb_create_window(m_connection, XCB_COPY_FROM_PARENT,
                      m_connectionEventListener, m_screens.at(0)->root(),
                      0, 0, 1, 1, 0, XCB_WINDOW_CLASS_INPUT_ONLY,
                      m_screens.at(0)->screen()->root_visual, 0, 0);
#ifndef QT_NO_DEBUG
    QByteArray ba("Qt xcb connection listener window");
    Q_XCB_CALL(xcb_change_property(xcb_connection(),
                                   XCB_PROP_MODE_REPLACE,
                                   m_connectionEventListener,
                                   atom(QXcbAtom::_NET_WM_NAME),
                                   atom(QXcbAtom::UTF8_STRING),
                                   8,
                                   ba.length(),
                                   ba.constData()));
#endif

    initializeGLX();
    initializeXFixes();
    initializeXRender();
    m_xi2Enabled = false;
#ifdef XCB_USE_XINPUT2_MAEMO
    initializeXInput2Maemo();
#elif defined(XCB_USE_XINPUT2)
    initializeXInput2();
#endif
    initializeXShape();
    initializeXKB();

    m_wmSupport.reset(new QXcbWMSupport(this));
    m_keyboard = new QXcbKeyboard(this);
#ifndef QT_NO_CLIPBOARD
    m_clipboard = new QXcbClipboard(this);
#endif
#ifndef QT_NO_DRAGANDDROP
    m_drag = new QXcbDrag(this);
#endif

    m_startupId = qgetenv("DESKTOP_STARTUP_ID");
    if (!m_startupId.isNull())
        qunsetenv("DESKTOP_STARTUP_ID");

    sync();
}

Błąd wywala w kluzurze #ifdef XCB_USE_XLIB (...) #else tak więc w moim przekonaniu zmienna dpy powinna być typu Display* a z nie wiadomych mi przyczyn jest typu: EGLNativeDisplayType

1

Spróbuj z -no-opengl

Ogólnie to twórcy Qt ostatnio sobie jakieś jaja robią, w ogóle nie testując czy biblioteka się kompiluje na wspieranych platformach.
Obowiązuje zasada „u mnie działa” - ja miałem problem ze skompilowaniem 5.2.0 pod Windows.

1 użytkowników online, w tym zalogowanych: 0, gości: 1