我正在尝试在 Arch Linux 机器上从头开始构建开源汽车项目。Motorcar 是一个 Linux VR 窗口管理器,可与 Oculus Rift D2K 耳机和 Razer Hydra 控制器一起使用。不过,您不需要这些项目来实际编译这个项目。
问题:我无法让汽车在我的机器上编译(Arch Linux)。我遇到了 Qt5 链接错误(解释如下)。
正如自述文件所示,为了制造汽车,需要以下先决条件:
此外,汽车项目分为以下实际构建目标:
libmotorcar-compositor:这是在此之后用于支持构建目标的实际汽车库。simple-compositor:这是一个简单的 Wayland 合成器,您可以从控制台启动它。一旦启动(在您的屏幕上,而不是在 VR 耳机中),您就可以在其中启动 3D 窗口程序。rift-hydra-compositor:这与 相同simple-compositor,只是它配备了对 Oculus Rift D2K 耳机和 Razer Hydra 控制器的支持。motorcar-client-demo:这是客户端“窗口”,这意味着在运行任意simple-compositor或rift-hydra-compositor。它只是一个旋转的立方体。启动 后simple-compositor,您应该能够将 alt-tab 切换到控制台并运行motorcar-client-demo(这将在运行中启动 3D 立方体simple-compositor)。我的系统:带有 nvidia 显卡(运行nvidia驱动程序)的Arch Linux 。
首先注意汽车项目提供了一个build.sh脚本。我试过使用它,但它在我的系统上不起作用。因此,我从源代码编译了所有内容。这是我是如何做到的(导致最终错误)。
首先我mesa-13.0.2.tar.gz从mesa下载。从焦油中取出后,我跑了:
$ ./configure --prefix=$WLD --enable-gles2 --disable-gallium-egl --with-egl-platforms=x11,wayland,drm --enable-gbm --enable-shared-glapi --with-gallium-drivers=r300,r600,swrast,nouveau --enable-glx-tls # what should $WLD be here? It might have been left blank.
$ make
$ sudo make install
Run Code Online (Sandbox Code Playgroud)
首先我LATEST-cairo-1.14.6从开罗的网站下载链接。从焦油中取出后,我跑了:
$ ./configure --prefix=$WLD --enable-xcb=yes --enable-gl=yes -enable-egl=yes # what should $WLD be here? It might have been left blank.
$ make
$ sudo make install
Run Code Online (Sandbox Code Playgroud)
我只是为此使用了我的包管理器。
$ sudo pacman -S wayland
$ sudo pacman -S weston # in case this is relevant
Run Code Online (Sandbox Code Playgroud)
在这里,我按照汽车自述文件的说明进行操作:
$ cd ~
$ git clone git://code.qt.io/qt/qt5.git qt5
$ cd qt5
$ git checkout 1497a398e34e18abb18f705b2294464840629ca1 # the Qt5 commit hash confirmed to work from the README
$ ./init-repository --no-webkit --module-subset=qtbase,qtdeclarative,qtwayland # I removed qtjsbackend from the module-subset since it isn't strictly needed
$ cd qtbase
$ git checkout 7010da2e6274febf71db40a535ce1d0c4858f143 # the qtbase commit hash confirmed to work from the README
$ cd ../qtwayland
$ git checkout 3dc9cfdbd2771c28c770d432b99e571db43fe599 # the qtwayland commit hash confirmed to work from the README
$ cd ../
$ ./configure -prefix /opt/qt5 -debug -confirm-license -opensource -egl -opengl -no-xcb-xlib
$ cd qtwayland
$ git clean -fdx
$ ../qtbase/bin/qmake CONFIG+=wayland-compositor
$ cd ../
$ make -j4 # the -j4 flag speeds up make by a factor of 4; otherwise this build takes a LONG time
$ make install
Run Code Online (Sandbox Code Playgroud)
libmotorcar-compositor$ cd ~
$ git clone https://github.com/evil0sheep/motorcar.git motorcar
$ /opt/qt5/bin/qmake
$ make
Run Code Online (Sandbox Code Playgroud)
simple-compositor$ cd ~/motorcar/src/examples/compositors/simple-compositor
$ make
g++ main.cpp -std=c++11 -I../../../../src/compositor -I../../../../src/protocol -I../../../../src/device -L../../../../lib -lmotorcar-compositor -o simple-compositor
../../../../lib/libmotorcar-compositor.so: undefined reference to `QGuiApplication::primaryScreen()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QSurfaceFormat::setDepthBufferSize(int)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWaylandCompositor::QWaylandCompositor(char const*, QFlags<QWaylandCompositor::ExtensionFlag>)'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QTimer::start(int)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QMatrix4x4::translate(float, float)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLContext::defaultFramebufferObject() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::resizeEvent(QResizeEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QGuiApplication::exec()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QSurfaceFormat::setStencilBufferSize(int)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QSurfaceFormat::~QSurfaceFormat()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `qFlagLocation(char const*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::childEvent(QChildEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QMetaObject::Connection::~Connection()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::staticMetaObject@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::metaObject() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::create()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::focusObject() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::setSurfaceType(QSurface::SurfaceType)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::wheelEvent(QWheelEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::accessibleRoot() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLTextureCache::QOpenGLTextureCache(QOpenGLContext*)@Qt_5_PRIVATE_API'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QSurfaceFormat::QSurfaceFormat(QSurfaceFormat const&)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::focusOutEvent(QFocusEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `non-virtual thunk to QWindow::format() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLShaderProgram::addShaderFromSourceCode(QFlags<QOpenGLShader::ShaderTypeBit>, char const*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QPixmap::fromImage(QImage const&, QFlags<Qt::ImageConversionFlag>)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLTexture::QOpenGLTexture(QImage const&, QOpenGLTexture::MipMapGeneration)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::qt_metacast(char const*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QScreen::geometry() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::~QObject()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLShaderProgram::QOpenGLShaderProgram(QObject*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::tabletEvent(QTabletEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::timerEvent(QTimerEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::showEvent(QShowEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::nativeEvent(QByteArray const&, void*, long*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::setGeometry(QRect const&)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QMatrix4x4::scale(float, float)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QSurfaceFormat::setSwapInterval(int)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::installEventFilter(QObject*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLShaderProgram::release()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWaylandCompositor::createOutput(QWindow*, QString const&, QString const&)'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QListData::dispose(QListData::Data*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLContext::QOpenGLContext(QObject*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLContext::create()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QImage::height() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QTimer::~QTimer()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QDateTime::currentMSecsSinceEpoch()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::eventFilter(QObject*, QEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QCoreApplication::self@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QGuiApplication::screens()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::hideEvent(QHideEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::disconnectNotify(QMetaMethod const&)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QCursor::~QCursor()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QCursor::QCursor(QPixmap const&, int, int)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLTexture::textureId() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QImage::~QImage()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::connect(QObject const*, char const*, QObject const*, char const*, Qt::ConnectionType)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::qt_metacall(QMetaObject::Call, int, void**)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLContext::functions() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObjectData::dynamicMetaObject() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLContext::setFormat(QSurfaceFormat const&)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWaylandCompositor::openUrl(QWaylandClient*, QUrl const&)'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QScreen::refreshRate() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::keyPressEvent(QKeyEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QGuiApplication::changeOverrideCursor(QCursor const&)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::qt_metacast(char const*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLShaderProgram::setUniformValue(int, QMatrix4x4 const&)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::mouseReleaseEvent(QMouseEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QImage::QImage()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::mouseDoubleClickEvent(QMouseEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::event(QEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::isExposed() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QImage::convertToFormat_helper(QImage::Format, QFlags<Qt::ImageConversionFlag>) const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::surfaceHandle() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::qt_metacall(QMetaObject::Call, int, void**)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QListData::detach(int)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::moveEvent(QMoveEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::sender() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `typeinfo for QWindow@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::mousePressEvent(QMouseEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QString::fromAscii_helper(char const*, int)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::event(QEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::QWindow(QScreen*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLTexture::~QOpenGLTexture()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `non-virtual thunk to QWindow::surfaceType() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QPixmap::~QPixmap()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLShaderProgram::bind()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QImage::width() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QGuiApplication::queryKeyboardModifiers()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::mouseMoveEvent(QMouseEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::keyReleaseEvent(QKeyEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `non-virtual thunk to QWindow::surfaceHandle() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QMetaObject::cast(QObject*) const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLContext::makeCurrent(QSurface*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::exposeEvent(QExposeEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::~QWindow()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLShaderProgram::attributeLocation(char const*) const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QImage::constBits() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QArrayData::deallocate(QArrayData*, unsigned long, unsigned long)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QGuiApplication::setOverrideCursor(QCursor const&)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::format() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `qt_assert(char const*, char const*, int)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLShaderProgram::uniformLocation(char const*) const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::showFullScreen()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLContext::currentContext()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QSurfaceFormat::QSurfaceFormat()@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::surfaceType() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QTimer::QTimer(QObject*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::focusInEvent(QFocusEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::geometry() const@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QWindow::setFormat(QSurfaceFormat const&)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::connectNotify(QMetaMethod const&)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QOpenGLContext::swapBuffers(QSurface*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::customEvent(QEvent*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QGuiApplication::QGuiApplication(int&, char**, int)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `QObject::QObject(QObject*)@Qt_5'
../../../../lib/libmotorcar-compositor.so: undefined reference to `typeinfo for QObject@Qt_5'
collect2: error: ld returned 1 exit status
make: *** [Makefile:14: compositor] Error 1
Run Code Online (Sandbox Code Playgroud)
libmotorcar-compositor.so上面的输出使我发现存在与libmotorcar-compositor库相关的内部链接错误,如下所示(注意错误的前三行):
$ cd ~/motorcar/lib
$ ls
libmotorcar-compositor.so libmotorcar-compositor.so.1 libmotorcar-compositor.so.1.0 libmotorcar-compositor.so.1.0.0
$ ldd libmotorcar-compositor.so
./libmotorcar-compositor.so: /opt/qt5/lib/libQt5Core.so.5: version `Qt_5' not found (required by ./libmotorcar-compositor.so)
./libmotorcar-compositor.so: /opt/qt5/lib/libQt5Gui.so.5: version `Qt_5_PRIVATE_API' not found (required by ./libmotorcar-compositor.so)
./libmotorcar-compositor.so: /opt/qt5/lib/libQt5Gui.so.5: version `Qt_5' not found (required by ./libmotorcar-compositor.so)
linux-vdso.so.1 (0x00007ffcb60c9000)
libQt5Widgets.so.5 => /opt/qt5/lib/libQt5Widgets.so.5 (0x00007f6084efa000)
libQt5Compositor.so.5 => /opt/qt5/lib/libQt5Compositor.so.5 (0x00007f6084e1a000)
libQt5Quick.so.5 => /opt/qt5/lib/libQt5Quick.so.5 (0x00007f60848f2000)
libQt5Qml.so.5 => /opt/qt5/lib/libQt5Qml.so.5 (0x00007f60842dc000)
libQt5Network.so.5 => /opt/qt5/lib/libQt5Network.so.5 (0x00007f6084133000)
libQt5Gui.so.5 => /opt/qt5/lib/libQt5Gui.so.5 (0x00007f6083a84000)
libQt5Core.so.5 => /opt/qt5/lib/libQt5Core.so.5 (0x00007f60834c6000)
libGL.so.1 => /usr/lib/libGL.so.1 (0x00007f608322a000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f608300d000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f6082c85000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007f6082981000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f608276a000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f60823ca000)
libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x00007f6082178000)
libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007f6081e65000)
libXext.so.6 => /usr/lib/libXext.so.6 (0x00007f6081c53000)
libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f6081914000)
libwayland-server.so.0 => /usr/lib/libwayland-server.so.0 (0x00007f6081701000)
libxkbcommon.so.0 => /usr/lib/libxkbcommon.so.0 (0x00007f60814bf000)
librt.so.1 => /usr/lib/librt.so.1 (0x00007f60812b7000)
libz.so.1 => /usr/lib/libz.so.1 (0x00007f60810a1000)
libpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f6080e6b000)
libicui18n.so.57 => /usr/lib/libicui18n.so.57 (0x00007f60809f1000)
libicuuc.so.57 => /usr/lib/libicuuc.so.57 (0x00007f6080647000)
libicudata.so.57 => /usr/lib/libicudata.so.57 (0x00007f607ebcb000)
libpcre16.so.0 => /usr/lib/libpcre16.so.0 (0x00007f607e962000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f607e75e000)
libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0x00007f607e55c000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00005591851f1000)
libexpat.so.1 => /usr/lib
尝试将 Qt 的bin目录添加到PATH和lib目录到LD_LIBRARY_PATH:
export PATH=/opt/qt5/bin:$PATH
export LD_LIBRARY_PATH=/opt/qt5/lib:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
我相信您可能已将您的shared-object.so库显式链接到/opt/qt5/lib/libQt5Core.so,但由于它又依赖于其他 Qt 库并且无法找到它们,因此您会遇到错误。上述调整可能会解决该问题。
也可以看看: