无法在Zynq中为嵌入式Linux编译Qt图表
我有一个用Qt5.12.2编写的应用程序,它使用QCharts绘制一些信号。我希望这个应用程序在基于Zynq的板上运行,特别是在Xilinx的Zybo板上。但是,为Xilinx提供的信息仅涵盖Qt版本5.4:,尽管它编译正确,但并没有提供我需要的Qt图表模块 我尝试过使用与Xilinx链接中所示相同的选项进行编译,但是有几个模块无法编译。为了避免这个错误,我尝试跳过我无法编译的模块,直到我发现Qt图表也无法编译为止 Qt编译的最后一个配置是:无法在Zynq中为嵌入式Linux编译Qt图表,qt,qt5,embedded-linux,zynq,qtcharts,Qt,Qt5,Embedded Linux,Zynq,Qtcharts,我有一个用Qt5.12.2编写的应用程序,它使用QCharts绘制一些信号。我希望这个应用程序在基于Zynq的板上运行,特别是在Xilinx的Zybo板上。但是,为Xilinx提供的信息仅涵盖Qt版本5.4:,尽管它编译正确,但并没有提供我需要的Qt图表模块 我尝试过使用与Xilinx链接中所示相同的选项进行编译,但是有几个模块无法编译。为了避免这个错误,我尝试跳过我无法编译的模块,直到我发现Qt图表也无法编译为止 Qt编译的最后一个配置是: ./configure -xplatform arm
./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
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
其中,$ZYNQ\u QT\u INSTALL
在本例中设置为/usr/local/QT-5.12.2/
编译中的最后一个错误是:
./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
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
我不知道如何正确地交叉编译这个版本。您能帮我解决这个问题吗?我不推荐Xilinx在该文档中描述的方法。下面的过程适用于运行Linux的任何类型的目标
如果您愿意使用Yocto/OpenEmbedded Qt5,可以随附支持,最新的Xilinx版本v2018.3在其meta-Qt5层中支持Qt 5.9.6。在Yocto生成的Linux映像中包含像qtcharts这样的包很容易。meta-toolchain-qt5目标提供SDK,该SDK可与QtCreator一起用于为目标交叉编译应用程序。我不推荐Xilinx在该文档中描述的方式。下面的过程适用于运行Linux的任何类型的目标
如果您愿意使用Yocto/OpenEmbedded Qt5,可以随附支持,最新的Xilinx版本v2018.3在其meta-Qt5层中支持Qt 5.9.6。在Yocto生成的Linux映像中包含像qtcharts这样的包很容易。meta-toolchain-qt5目标提供了SDK,可与QtCreator一起用于交叉编译目标的应用程序。Qt图表的一部分实现了QML的代码,因此Qt图表的依赖关系必须是QtQuick,因此我认为您不应跳过Qt声明性模块这是一个有趣的点。然而,当我启用Qt声明时,我遇到了一些与
items/qquickclipnode\u p.h:57:30:error:comdat本地函数相关的编译错误,该函数在其comdat类Q\u QUICK\u PRIVATE\u EXPORT QQuickDefaultClipNode:public QSGClipNode
之外由void qquickwindowcubationcontroller::cubate()调用,这在Qt 5.12版本中发生,Qt5.9,显然,Qt5.11中也有,如Xilinx论坛中打开的一个线程所示:我正在查看QtCharts repo:,我发现它不应该产生问题。因此,我再次建议您只编译qtbase:在编译qtchart之后,请尝试编译qtchart。我按照您的建议,首先编译qtbase模块,没有任何错误。但是,当我尝试编译QtChart模块时,我得到了与第一次编译Qtdeclarative时相同的错误:items/qquickclipnode\u p.h:57:30:error:comdat本地函数,由void qquickWindowCubationControl::Cubate()在其comdat类Q_QUICK\u PRIVATE\u EXPORT QQuickDefaultClipNode:public QSGClipNode
之外调用。显然,依赖于此项的任何模块都无法编译。好的,我建议您先选择正在使用的分支,然后编辑文件删除qtHaveModule(quick){SUBDIRS+=chartsqml2}
,并删除可能导致问题的chartsqml2目录,然后编译项目,我认为Qt图表不会使用QML,Qt图表的一部分为QML实现代码,因此Qt图表的依赖关系必须是QtQuick,因此我认为您不应该跳过Qt声明性模块这是一个有趣的点。然而,当我启用Qt声明时,我遇到了一些与items/qquickclipnode\u p.h:57:30:error:comdat本地函数相关的编译错误,该函数在其comdat类Q\u QUICK\u PRIVATE\u EXPORT QQuickDefaultClipNode:public QSGClipNode
之外由void qquickwindowcubationcontroller::cubate()调用,这在Qt 5.12版本中发生,Qt5.9,显然,Qt5.11中也有,如Xilinx论坛中打开的一个线程所示:我正在查看QtCharts repo:,我发现它不应该产生问题。因此,我再次建议您只编译qtbase:在编译qtchart之后,请尝试编译qtchart。我按照您的建议,首先编译qtbase模块,没有任何错误。但是,当我尝试编译QtChart模块时,我得到了与第一次编译Qtdeclarative时相同的错误:items/qquickclipnode\u p.h:57:30:error:comdat本地函数,由void qquickWindowCubationControl::Cubate()在其comdat类Q_QUICK\u PRIVATE\u EXPORT QQuickDefaultClipNode:public QSGClipNode
之外调用。显然,依赖于此项的任何模块都无法编译。好的,我建议您先选择正在使用的分支,然后编辑文件删除qtHaveModule(quick){SUBDIRS+=chartsqml2}
,并删除可能导致问题的chartsqml2目录,然后编译项目,我认为Qt图表不会使用qmlineresting!事实上,我遵循@eyllanesc指出的解决方法,实现了编译,牺牲了所有qtquick功能和相关模块。但是,当我试图在QtCreator中使用时,我无法编译我的应用程序。我想,这是因为为Xilinx提供的工具链(我使用的是2018.2)与文件系统中的库(Linaro Ubuntu12.11)不兼容。实际上,我不愿意使用过时的发行版,但是,这是预装桌面环境的最新版本。我从来没有证明过Yocto,我会复习的@LuighiAnthonyVitónZorrilla Yocto是最好的选择,因为它允许您自定义它,如果您不想要桌面,它非常轻且理想system@LuighiAnthonyVit我也检查了一下