文章目录
PC端(与开发板系统一致,一般由开发板厂商提供虚拟机)来交叉编译程序。
一、交叉编译QT5.15.2
qt源码也需要交叉编译,交叉编译时有些模块会报错,当这些模块在程序中用不到时,可以忽略这些模块。
交叉编译步骤如下:
- 安装交叉编译器,(一般这一步可省略,因为使用的是开发板厂商提供的虚拟机,里面已安装好交叉编译器,虚拟机中的交叉编译器与开发板中的交叉编译器一致)
##安装 g++-aarch64-linux-gnu 交叉编译器$sudo apt install g++-aarch64-linux-gnu #安装$aarch64-linux-gnu-g++-v #查看默认安装的gcc版本
- 将要编译的qt-5.15.2源码下载下来,并移动到
/opt
文件夹 - 在qt源码根目录下制作编译脚本:
autoConfig.sh
,并修改文件权限:chmod 777 autoConfig.sh``````./configure \-prefix /opt/qt-arm \-release \-opensource \-skip qtwayland \-skip qtlocation \-skip qtscript \-xplatform linux-aarch64-gnu-g++ \-make libs \-optimized-qmake \-no-opengl \-no-sse2 \-no-openssl \-no-cups \-no-glib \-no-pkg-config \-no-separate-debug-info \-pch \-shared \-qt-libjpeg \-qt-zlib \-qt-libpng
--prefix <dir>
:指定安装目录--release
:此选项在编译过程QT会对程序进行优化,在发布软件的时候应该用此选项,是默认选项--opensource
:以开源版本发布程序--skip
:用于指定跳过某些模块的编译过程--xplatform
:交叉编译过程指定目标平台--make libs
:用于指定只编译Qt库而不编译Qt应用程序。这样可以节省编译时间和资源,并且可以方便地将编译好的Qt库集成到目标平台的开发环境中。--optimized-qmake
:开启qmake的优化作用--no-opengl
:表示禁用OpenGL支持。OpenGL是一种跨平台的图形库,用于渲染2D和3D图形。禁用OpenGL意味着Qt将不会使用OpenGL进行图形渲染,而是使用其他的图形渲染方式。--no-sse2
:表示禁用SSE2指令集的优化。SSE2(Streaming SIMD Extensions 2)是一组SIMD(单指令多数据)指令,用于加速处理器对多个数据的并行处理。禁用SSE2意味着编译的Qt库将不会使用SSE2指令集进行优化,这可能会导致一些性能上的损失,但也可以确保生成的二进制文件在不支持SSE2指令集的处理器上能够正常运行。--no-openssl
:表示不包含OpenSSL库。OpenSSL是一个开源的加密和安全套接字层库,用于提供网络通信的安全性。通过使用"-no-openssl"选项,可以在编译Qt时排除对OpenSSL库的依赖,从而减小生成的Qt库的大小。--no-cups
:表示不包含CUPS(通用UNIX打印系统)支持。CUPS是一种开源的打印系统,用于在UNIX和类UNIX操作系统上提供打印功能。通过使用"-no-cups"选项,可以在编译QT时排除CUPS相关的代码和依赖库,从而减小生成的QT库的大小。--no-glib
:表示不使用GLib库。GLib是一个C语言的通用工具库,它提供了许多数据结构、线程支持、内存管理等功能。在默认情况下,Qt会使用GLib库来提供一些跨平台的功能。 使用"-no-glib"选项的目的是在交叉编译Qt时排除GLib库的依赖,从而减小生成的Qt库的体积,并且避免与其他可能已经存在的GLib版本冲突。--no-pkg-config
:表示禁用pkg-config工具的使用。pkg-config是一个用于查询和获取编译和链接库信息的工具,它可以帮助自动配置编译器和链接器的选项。 使用"-no-pkg-config"选项的目的是告诉Qt编译系统不要使用pkg-config来查找和配置依赖库。--no-separate-debug-info
:在编译Qt时不生成独立的调试信息文件。通常情况下,编译生成的可执行文件和调试信息是分开存储的,可执行文件用于运行程序,而调试信息文件用于调试程序。但是在某些情况下,我们可能希望将调试信息直接嵌入到可执行文件中,而不是生成独立的调试信息文件。--pch
:它代表"precompiled headers",即预编译头文件。预编译头文件是为了提高编译速度而引入的一种机制。 在编译大型项目时,头文件的包含关系可能非常复杂,每次编译都需要重新解析和编译这些头文件,导致编译时间较长。为了解决这个问题,可以使用预编译头文件的方式。 预编译头文件的原理是将常用的头文件预先编译成二进制文件,并在后续的编译过程中直接使用这个二进制文件,避免了重复解析和编译头文件的过程,从而提高了编译速度。 在交叉编译Qt时,使用-pch选项可以启用预编译头文件的功能。通过预先生成并使用预编译头文件,可以加快Qt库的编译速度,特别是在资源有限的嵌入式系统上。--shared
:使用-shared选项编译Qt时,会生成一个共享库文件,其中包含了Qt框架的函数和资源。 共享库的好处是可以减小应用程序的体积,因为多个应用程序可以共享同一个库文件。此外,共享库还可以动态加载和卸载,使得应用程序更加灵活和可扩展。--qt-libjpeg
:用于指定是否使用libjpeg库来支持JPEG图像格式。libjpeg是一个开源的JPEG图像压缩和解压缩库,它提供了对JPEG图像的编码和解码功能。--qt-zlib
:用于指定是否使用系统的zlib库还是Qt自带的zlib库。 使用-qt-zlib选项可以方便地控制Qt在编译过程中使用哪个zlib库。如果选择使用Qt自带的zlib库,可以确保在不同平台上的一致性和可移植性。而如果选择使用系统中已安装的zlib库,可以避免重复编译和依赖管理的问题。--qt-libpng
:用于指定是否使用libpng库来支持PNG图像格式。libpng是一个用于处理PNG图像的开源库,它提供了读取、写入和操作PNG图像的功能。qt交叉编译参数介绍 - 运行该编译脚本
root@ubuntu:/opt/qt-everywhere-src-5.15.2# ./autoConfig.sh + cd qtbase+/opt/qt-everywhere-src-5.15.2/qtbase/configure -top-level -prefix /opt/qt-arm -release -opensource -skip qtwayland -skip qtlocation -skip qtscript -xplatform linux-aarch64-gnu-g++-make libs -optimized-qmake -no-opengl -no-sse2 -no-openssl -no-cups -no-glib -no-pkg-config -no-separate-debug-info -pch -shared -qt-libjpeg -qt-zlib -qt-libpngCreating qmake....Done.Info: creating stash file /opt/qt-everywhere-src-5.15.2/.qmake.stashThis is the Qt Open Source Edition. You are licensed to use this software under the terms of...
- 构建:
make
,耗时很长root@ubuntu:/opt/qt-everywhere-src-5.15.2# makecd qtbase/&&( test -e Makefile ||/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -o Makefile /opt/qt-everywhere-src-5.15.2/qtbase/qtbase.pro )&& make -f Makefile Info: creating cache file /opt/qt-everywhere-src-5.15.2/qtbase/.qmake.cachemake[1]: 进入目录“/opt/qt-everywhere-src-5.15.2/qtbase”cd src/&&( test -e Makefile ||/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -o Makefile /opt/qt-everywhere-src-5.15.2/qtbase/src/src.pro )&& make -f Makefile make[2]: 进入目录“/opt/qt-everywhere-src-5.15.2/qtbase/src”cd corelib/&&( test -e Makefile.qtzlib ||/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -o Makefile.qtzlib /opt/qt-everywhere-src-5.15.2/qtbase/src/corelib/qtzlib.pro )&& make -f Makefile.qtzlib make[3]: 进入目录“/opt/qt-everywhere-src-5.15.2/qtbase/src/corelib”make[3]: 对“first”无需做任何事。make[3]: 离开目录“/opt/qt-everywhere-src-5.15.2/qtbase/src/corelib”cd tools/bootstrap/&&( test -e Makefile ||/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -o Makefile /opt/qt-everywhere-src-5.15.2/qtbase/src/tools/bootstrap/bootstrap.pro )&& make -f Makefile make[3]: 进入目录“/opt/qt-everywhere-src-5.15.2/qtbase/src/tools/bootstrap”g++-c -pipe -O2 -fPIC -std=c++11-ffunction-sections -fdata-sections -fno-exceptions -Wall -Wextra -D_REENTRANT -DQT_NO_LINKED_LIST -DQT_NO_JAVA_STYLE_ITERATORS -DQT_VERSION_STR='"5.15.2"'-DQT_VERSION_MAJOR=5-DQT_VERSION_MINOR=15-DQT_VERSION_PATCH=2-DQT_BOOTSTRAPPED -DQT_NO_CAST_TO_ASCII -DQT_NO_FOREACH -DQT_NO_CAST_FROM_ASCII -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_BUILD_BOOTSTRAP_LIB -DQT_BUILDING_QT -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000-DQT_DEPRECATED_WARNINGS_SINCE=0x060000-DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -I.-I../../3rdparty/zlib/src -I../../tools -I../../3rdparty/tinycbor/src -I../../../include -I../../../include/QtCore -I../../../include/QtCore/5.15.2-I../../../include/QtCore/5.15.2/QtCore -I../../../include/QtXml -I../../../include/QtXml/5.15.2-I../../../include/QtXml/5.15.2/QtXml -I../../../mkspecs/linux-g++-o .obj/qlatincodec.o ../../corelib/codecs/qlatincodec.cpp.........很长
- 安装:
make install``````root@ubuntu:/opt/qt-everywhere-src-5.15.2# make installcd qtbase/&&( test -e Makefile ||/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -o Makefile /opt/qt-everywhere-src-5.15.2/qtbase/qtbase.pro )&& make -f Makefile installmake[1]: 进入目录“/opt/qt-everywhere-src-5.15.2/qtbase”cd src/&&( test -e Makefile ||/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -o Makefile /opt/qt-everywhere-src-5.15.2/qtbase/src/src.pro )&& make -f Makefile installmake[2]: 进入目录“/opt/qt-everywhere-src-5.15.2/qtbase/src”cd corelib/&&( test -e Makefile.qtzlib ||/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -o Makefile.qtzlib /opt/qt-everywhere-src-5.15.2/qtbase/src/corelib/qtzlib.pro )&& make -f Makefile.qtzlib installmake[3]: 进入目录“/opt/qt-everywhere-src-5.15.2/qtbase/src/corelib”sed -e 's,/opt/qt-everywhere-src-5.15.2/[^/][^/]*/lib,$$[QT_INSTALL_LIBS],g' -e 's,/opt/qt-arm/lib,$$[QT_INSTALL_LIBS],g'../../lib/libQt5Zlib.prl >/opt/qt-arm/lib/libQt5Zlib.prlsed -e 's,/opt/qt-everywhere-src-5.15.2/[^/][^/]*/lib,=/opt/qt-arm/lib,g'../../lib/Qt5Zlib.la >/opt/qt-arm/lib/Qt5Zlib.la/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -install qinstall /opt/qt-everywhere-src-5.15.2/qtbase/src/3rdparty/zlib/src/zconf.h /opt/qt-arm/include/QtZlib/zconf.h/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -install qinstall /opt/qt-everywhere-src-5.15.2/qtbase/src/3rdparty/zlib/src/zlib.h /opt/qt-arm/include/QtZlib/zlib.h/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -install qinstall /opt/qt-everywhere-src-5.15.2/qtbase/mkspecs/modules-inst/qt_lib_zlib_private.pri /opt/qt-arm/mkspecs/modules/qt_lib_zlib_private.pri/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -install qinstall /opt/qt-everywhere-src-5.15.2/qtbase/lib/cmake/Qt5Zlib/Qt5ZlibConfig.cmake /opt/qt-arm/lib/cmake/Qt5Zlib/Qt5ZlibConfig.cmake/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -install qinstall /opt/qt-everywhere-src-5.15.2/qtbase/lib/cmake/Qt5Zlib/Qt5ZlibConfigVersion.cmake /opt/qt-arm/lib/cmake/Qt5Zlib/Qt5ZlibConfigVersion.cmakemake[3]: 离开目录“/opt/qt-everywhere-src-5.15.2/qtbase/src/corelib”cd tools/bootstrap/&&( test -e Makefile ||/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -o Makefile /opt/qt-everywhere-src-5.15.2/qtbase/src/tools/bootstrap/bootstrap.pro )&& make -f Makefile installmake[3]: 进入目录“/opt/qt-everywhere-src-5.15.2/qtbase/src/tools/bootstrap”/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -install qinstall ../../../lib/libQt5Bootstrap.a /opt/qt-arm/lib/libQt5Bootstrap.ased -e 's,/opt/qt-everywhere-src-5.15.2/[^/][^/]*/lib,$$[QT_HOST_LIBS],g' -e 's,/opt/qt-arm/lib,$$[QT_HOST_LIBS],g'../../../lib/libQt5Bootstrap.prl >/opt/qt-arm/lib/libQt5Bootstrap.prlsed -e 's,/opt/qt-everywhere-src-5.15.2/[^/][^/]*/lib,/opt/qt-arm/lib,g'../../../lib/libQt5Bootstrap.la >/opt/qt-arm/lib/libQt5Bootstrap.la/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -install qinstall /opt/qt-everywhere-src-5.15.2/qtbase/mkspecs/modules-inst/qt_lib_bootstrap_private.pri /opt/qt-arm/mkspecs/modules/qt_lib_bootstrap_private.primake[3]: 离开目录“/opt/qt-everywhere-src-5.15.2/qtbase/src/tools/bootstrap”cd tools/moc/&&( test -e Makefile ||/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -o Makefile /opt/qt-everywhere-src-5.15.2/qtbase/src/tools/moc/moc.pro )&& make -f Makefile installmake[3]: 进入目录“/opt/qt-everywhere-src-5.15.2/qtbase/src/tools/moc”/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -install qinstall -exe ../../../bin/moc /opt/qt-arm/bin/mocstrip /opt/qt-arm/bin/mocmake[3]: 离开目录“/opt/qt-everywhere-src-5.15.2/qtbase/src/tools/moc”cd tools/rcc/&&( test -e Makefile ||/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -o Makefile /opt/qt-everywhere-src-5.15.2/qtbase/src/tools/rcc/rcc.pro )&& make -f Makefile installmake[3]: 进入目录“/opt/qt-everywhere-src-5.15.2/qtbase/src/tools/rcc”/opt/qt-everywhere-src-5.15.2/qtbase/bin/qmake -install qinstall -exe ../../../bin/rcc /opt/qt-arm/bin/rccstrip /opt/qt-arm/bin/rcc......很长
详细内容可参考交叉编译 Qt5.12.8
二、ARM开发板上环境变量设置
将编译好的程序打包发送到开发板,在开发板上需通过两个命令来设置环境变量:
vim ~/.bashrc
vim /etc/profile
版权归原作者 嵌入式_晚风 所有, 如有侵权,请联系我们删除。