Не удается скомпилировать диаграммы Qt для встроенного Linux в Zynq

У меня было приложение, написанное на Qt5.12.2, которое использует QCharts для построения некоторых сигналов. Я хочу, чтобы это приложение работало на плате на основе Zynq, особенно на плате Zybo от Xilinx. Однако предоставленная информация для Xilinx относится только к Qt версии 5.4: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842110/Qt+Qwt+Build+Instructions+Qt+5.4.2+Qwt+6.1.2, который, хотя и компилируется корректно, не предоставляет нужного мне модуля Qt Charts.

Я попытался скомпилировать с теми же параметрами, что и в ссылке Xilinx, однако несколько модулей не удалось скомпилировать. Чтобы избежать этих ошибок, я пытался пропустить модули, которые я не могу скомпилировать, пока не пришел к выводу, что диаграммы Qt также не могут быть скомпилированы.

Последняя конфигурация для компиляции Qt была:

./configure -xplatform arm-linux-gnueabihf-g++ \
    -opensource \
    -confirm-license \
    -nomake examples \
    -verbose -skip qtpurchasing -skip qtconnectivity -skip qtdeclarative -skip qtlocation -skip qtmultimedia -skip qtquickcontrols -skip qtsensors -skip qttools -skip qtwebsockets -skip qtwinextras -skip qtwebchannel -skip qtwebengine \
    -no-gif \
    -no-libjpeg \
    -no-mtdev \
    -no-sql-db2 \
    -no-sql-ibase \
    -no-sql-mysql \
    -no-xcb \
    -qt-freetype \
    -no-fontconfig \
    -no-harfbuzz \
    -no-xcb-xlib \
    -no-cups \
    -no-iconv \
    -no-icu \
    -no-eglfs -no-opengl\
    -no-openssl \
    -prefix $ZYNQ_QT_INSTALL

Где $ZYNQ_QT_INSTALL в этом случае было установлено на /usr/local/Qt-5.12.2/.

Последней ошибкой компиляции была:

arm-linux-gnueabihf-g++ -Wl,-O1 -Wl,--enable-new-dtags -Wl,-z,origin -Wl,-rpath,\$ORIGIN/../../lib -shared -o libqtchartsqml2.so .obj/chartsqml2_plugin.o .obj/declarativechart.o .obj/declarativexypoint.o .obj/declarativexyseries.o .obj/declarativelineseries.o .obj/declarativesplineseries.o .obj/declarativeareaseries.o .obj/declarativescatterseries.o .obj/declarativepieseries.o .obj/declarativebarseries.o .obj/declarativecategoryaxis.o .obj/declarativemargins.o .obj/declarativeaxes.o .obj/declarativepolarchart.o .obj/declarativeboxplotseries.o .obj/declarativechartnode.o .obj/declarativecandlestickseries.o  -L/home/luighi/Qt-crosscompiled/qt5/qtdeclarative/lib -lQt5Quick -L/home/luighi/Qt-crosscompiled/qt5/qtbase/lib -L/home/luighi/Qt-crosscompiled/qt5/qtcharts/lib -lQt5Charts -lQt5Widgets -lQt5Gui -lQt5Qml -lQt5Network -lQt5Core -lpthread    
/opt/Xilinx/SDK/2018.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin/../lib/gcc/arm-linux-gnueabihf/7.2.1/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lQt5Quick
collect2: error: ld returned 1 exit status
make[3]: *** [Makefile:140: ../../qml/QtCharts/libqtchartsqml2.so] Error 1
make[3]: Leaving directory '/home/luighi/Qt-crosscompiled/qt5/qtcharts/src/chartsqml2'
make[2]: *** [Makefile:91: sub-chartsqml2-make_first-ordered] Error 2
make[2]: Leaving directory '/home/luighi/Qt-crosscompiled/qt5/qtcharts/src'
make[1]: *** [Makefile:49: sub-src-make_first] Error 2
make[1]: Leaving directory '/home/luighi/Qt-crosscompiled/qt5/qtcharts'
make: *** [Makefile:493: module-qtcharts-make_first] Error 2

Я не знаю, как добиться правильной кросс-компиляции этой версии. Не могли бы вы помочь мне решить эту проблему, пожалуйста?


person Luighi Viton-Zorrilla    schedule 01.04.2019    source источник
comment
Часть Qt Charts реализует код для QML, поэтому зависимость Qt Charts должна быть QtQuick, поэтому я вижу, что вы не должны пропускать модуль qtdeclarative   -  person eyllanesc    schedule 02.04.2019
comment
Это интересный момент. Однако, когда я включил декларативный Qt, у меня были некоторые ошибки компиляции, связанные с items/qquickclipnode_p.h:57:30: error: comdat-local function called by void QQuickWindowIncubationController::incubate() outside its comdat class Q_QUICK_PRIVATE_EXPORT QQuickDefaultClipNode : public QSGClipNode Это происходит в версии Qt 5.12, Qt 5.9 и, по-видимому, также в Qt 5.11, как показано в открытом потоке на форуме Xilinx: forums.xilinx.com/t5/Embedded-Development-Tools/   -  person Luighi Viton-Zorrilla    schedule 02.04.2019
comment
Я просматривал репозиторий QtCharts: code.qt.io/cgit/qt/qtcharts. git, и я вижу, что это не должно создавать проблем. Поэтому я рекомендую вам снова просто скомпилировать qtbase: code.qt.io/cgit/qt/ qtbase.git и после этого просто попробуйте скомпилировать Qt Charts   -  person eyllanesc    schedule 02.04.2019
comment
Я последовал вашему предложению, сначала скомпилировав модуль qtbase без ошибок. Однако, когда я пытаюсь скомпилировать модуль QtChart, я получаю ту же ошибку, что и при первой компиляции Qtdeclarative: items/qquickclipnode_p.h:57:30: error: comdat-local function called by void QQuickWindowIncubationController::incubate() outside its comdat class Q_QUICK_PRIVATE_EXPORT QQuickDefaultClipNode : public QSGClipNode. Судя по всему, ни один модуль, который зависит от этого элемента, не может быть скомпилирован.   -  person Luighi Viton-Zorrilla    schedule 02.04.2019
comment
Хорошо, я рекомендую вам создать ответвление github.com/qt/qtcharts/tree, выберите brach, который вы используете, затем отредактируйте файл github.com/qt/qtcharts /blob/5.12/src/src.pro удаляя qtHaveModule(quick) { SUBDIRS += chartsqml2 } , а также удаляя директорию chartsqml2 которая может вызвать проблемы и компилировать проект, я думаю что Qt Charts не будет использовать QML   -  person eyllanesc    schedule 02.04.2019
comment
Спасибо, я смог скомпилировать QtCharts, внеся некоторые изменения в сгенерированный файл makefile, чтобы пропустить декларативную зависимость qt. Удаление chartsqml12 не требовалось. Действительно, требуется завершить компиляцию без ошибок. Однако теперь у меня есть другая проблема, когда я не могу использовать кросс-компилированную библиотеку в своем дистрибутиве файловой системы, по-видимому, из-за некоторой несовместимости версий между набором инструментов xilinx и установленными библиотеками в дистрибутиве файловой системы.   -  person Luighi Viton-Zorrilla    schedule 03.04.2019
comment
Когда вы выполняете кросс-компилятор, вам нужно скопировать файлы на ваше устройство (xilinx). Вы это сделали?, потому что, если вы этого не сделали, бинарники находятся только в вашем HOST.   -  person eyllanesc    schedule 03.04.2019
comment
Например, в этом руководстве на шаге 11 скопируйте двоичные файлы + заголовки в rpi, что-то похожее на то, что вы должен сделать, я указываю это, потому что в вашем руководстве я не вижу этого шага.   -  person eyllanesc    schedule 03.04.2019
comment
Действительно, я сделал это. Однако при установке на целевое устройство он не получает правильную версию библиотек glibc. Я предполагаю, что он устарел по сравнению с набором инструментов xilinx. Я проверял это при попытке скомпилировать библиотеки qt против корневой файловой системы linaro (что дало мне несколько ошибок и, следовательно, не было успешным), что, хотя руководство xilinx не учитывает, я считаю это важным в соответствии с руководство linaro. Видимо, мне нужно перейти на другую файловую систему.   -  person Luighi Viton-Zorrilla    schedule 04.04.2019


Ответы (1)


Я бы не рекомендовал способ, который Xilinx описывает в этой документации. Приведенный ниже процесс будет работать для любой цели под управлением Linux.

Если вы хотите использовать Yocto/OpenEmbedded, поддержка Qt5 может быть включена в него, а последний выпуск Xilinx v2018.3 поддерживает Qt 5.9.6 на уровне мета-qt5. В образ Linux, сгенерированный Yocto, легко включить такие пакеты, как qtcharts. Цель meta-toolchain-qt5 предоставляет SDK, который можно использовать с QtCreator для кросс-компиляции приложений для намеченной цели.

person Sanchayan Maity    schedule 03.04.2019
comment
Интересный! Фактически, я следовал обходному пути, указанному @eyllanesc, добившись компиляции, пожертвовав всеми функциями qtquick и связанными модулями. Но в конце, когда я попытался использовать в QtCreator, я не смог скомпилировать свое приложение. Я думаю, это из-за несовместимости набора инструментов, предоставленного для Xilinx (я использую 2018.2), с библиотеками в файловой системе (Linaro Ubuntu 12.11). На самом деле, я не хотел использовать устаревший дистрибутив, однако это был самый последний дистрибутив с предустановленной средой рабочего стола. Я никогда не доказывал Yocto, я пересмотрю его! - person Luighi Viton-Zorrilla; 03.04.2019
comment
@LuighiAnthonyVitónZorrilla Yocto — лучший вариант, потому что он позволяет вам настраивать его, что очень легко и идеально, если вам не нужна настольная система. - person eyllanesc; 03.04.2019
comment
@LuighiAnthonyVitónZorrilla Я также проверил сборку qtcharts. Я использую UltraScale MPSoC, и qtcharts работает нормально. Я не собирал meta-toolchain-qt5, но надеюсь, что он тоже будет хорошо собран. - person Sanchayan Maity; 04.04.2019
comment
@SanchayanMaity Я также пытаюсь выполнить кросс-компиляцию qt, но получаю сообщение об ошибке, поскольку OPENGLES не найден .. Не могли бы вы сообщить мне процедуру кросс-компиляции с использованием потока Yocto (meta-toolchain-qt5) - person Vikas Singh; 17.12.2019