一 window平台编译
先将 MinGW 或者Visual Studio toolchains的编译器加到环境变量中去。
configure.bat -platform win32-g++
configure.bat -platform win32-msvc
二 window平台交叉编译arm版Qt
- 先配置好g++和arm-linux-g++
- 更改mkspecs里的linux-arm-gnueabi-g++项目,前缀与你的交叉编译器要致。
- 配置注意事项,-platform指定编译主机生成主机上可运行的qmake.exe,-xplatform指定交叉编译的目标平台,-device-option指定交叉编译器。
./configure -platform win32-g++ \ -xplatform linux-arm-gnueabi-g++ \ -device-option CROSS_COMPILE=arm-linux-gnueabi- -prefix /d/Qt/dir ...
- make工具可以直接使用qtcreator中的mingw32-make.exe
三 linux平台交叉编译window的QT
参考使用MXE
这里有篇参考就不写了
Linux下编译静态MinGW环境,编译windows平台Qt程序(使用MXE)
编译好后设置qt kit
- 设置qmake
mxe/usr/x86_64-w64-mingw32.static/qt5/bin/qmake
- 设置编译器
在ABI中行选中自定义,设置如下mxe/usr/bin/x86_64-w64-mingw32.static-gcc mxe/usr/bin/x86_64-w64-mingw32.static-g++
x86-windows-msys-pe-64bit
- 设置kit
ok,现在可以使用qtcreator编译window的exe了。
其它
-
You cannot configure qt separately within a top-level build
在build目录下创建 .qmake.stash和 .qmake.super两个空文件。 -
安装目录指定说明
-prefix qt库在目标板device上的安装目录 -extprefix qt库编译主机host上的安装目录
-
编译平台指定
-platform //指定编译主机host -xplatform/device //指定交叉编译device -device-option CROSS_COMPILE=arm-linux- //指定交叉编译器前缀
-
OpenGL ES 2.0 disabled
ERROR: Feature 'opengles2' was enabled, but the pre-condition 'config.win32 || (!config.watchos && !features.opengl-desktop && libs.opengl_es2)' failed. ERROR: Feature 'eglfs' was enabled, but the pre-condition '!config.android && !config.darwin && !config.win32 && features.egl' failed. ERROR: The OpenGL functionality tests failed! You might need to modify the include and library search paths by editing QMAKE_INCDIR_OPENGL[_ES2], QMAKE_LIBDIR_OPENGL[_ES2] and QMAKE_LIBS_OPENGL[_ES2] in the mkspec for your platform. Check config.log for details.
查看config.log中相应的错误,
-
方法1 在devices/linux-imx6-g++/qmake.conf中增加QMAKE_INCDIR_OPENGL_ES2,QMAKE_LIBDIR_OPENGL_ES2两变量如下:
include(../common/linux_device_pre.conf) #GPU_VIV_SDK = /opt/EmbedSky/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/qt5.5/rootfs_imx6q_V3_qt5.5_env/ GPU_VIV_SDK = /home/anzye/Workspace/imx/gpu-viv-sdk QMAKE_INCDIR_OPENGL = $$GPU_VIV_SDK/usr/include QMAKE_LIBDIR_OPENGL = $$GPU_VIV_SDK/usr/lib QMAKE_INCDIR_OPENGL_ES2 = $$QMAKE_INCDIR_OPENGL QMAKE_LIBDIR_OPENGL_ES2 = $$QMAKE_LIBDIR_OPENGL QMAKE_INCDIR_EGL = $$QMAKE_INCDIR_OPENGL QMAKE_LIBDIR_EGL = $$QMAKE_LIBDIR_OPENGL QMAKE_INCDIR_OPENVG = $$QMAKE_INCDIR_OPENGL QMAKE_LIBDIR_OPENVG = $$QMAKE_LIBDIR_OPENGL QMAKE_LIBS_EGL += -lEGL -GAL QMAKE_LIBS_OPENGL_ES2 += -lGLESv2 -lEGL -lGAL QMAKE_LIBS_OPENVG += -lOpenVG -lEGL -lGAL IMX6_CFLAGS = -march=armv7-a -mfpu=neon -DLINUX=1 -DEGL_API_FB=1 QMAKE_CFLAGS += $$IMX6_CFLAGS QMAKE_CXXFLAGS += $$IMX6_CFLAGS DISTRO_OPTS += hard-float # Preferred eglfs backend EGLFS_DEVICE_INTEGRATION = eglfs_viv include(../common/linux_arm_device_post.conf) load(qt_config)
注意事项,QMAKE_INCDIR_OPENGL_ES2只需包含到include目录,别写到GLES2目录去了,查看config.log的错误原因是找不到文件
GLES2/gl2.h
。配置好后在.configure时依然会错,这次再查看config.log,此时错误提示为ld找不到
lib/libc_nonshared.a
,ld-linux-armhf.so.3
等几个库文件,需要设置下-sysroot变量使其能正常ld到库。如下./configure -prefix /usr/imx/qt5 -extprefix /opt/arm_lib/qt5 \ -sysroot /opt/EmbedSky/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/qt5.5/rootfs_imx6q_V3_qt5.5_env \ -platform linux-g++ \ -device linux-imx6-g++ \ -device-option CROSS_COMPILE=arm-linux- \ -opensource \ -confirm-license \ -static \ -strip \ -silent \ -opengl es2 \ -qpa eglfs \ -eglfs \ -optimized-qmake \ -no-cups -no-iconv -no-pch -no-gbm -no-gtk \ -skip qt3d \ -skip qtactiveqt \ -skip qtandroidextras \ -skip qtcanvas3d \ -skip qtdatavis3d \ -skip qtmacextras \ -skip qtwinextras \ -skip qtgamepad \ -skip qtdoc \ -nomake tools -nomake examples -nomake tests
注意,每次configure时,把前面的清空才行
-
方法2 直接在configure时加上**-I -L**参数指定sdk目录。
../configure -prefix /usr/lib/qt5 -extprefix /opt/EmbedSky/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/qt5 \ -platform linux-g++ \ -device linux-imx6-g++ \ -device-option CROSS_COMPILE=arm-linux-gnueabihf- \ -L "/home/anzye/Workspace/imx/gpu-viv-sdk/usr/lib" \ -I "/home/anzye/Workspace/imx/gpu-viv-sdk/usr/include" \
如果没有Opengl es库也可参照QT移植
B) Opengl ES库: gpu-viv-bin-mx6q-3.10.17-1.0.0.tar.gz 下载地址为:
http://repository.timesys.com/buildsources/g/gpu-viv-bin-mx6q/gpu-viv-bin-mx6q-3.10.17-1.0.0/
或到Qter开源社区下载。 下载后使用如下命令进行解压:
tar xvzf gpu-viv-bin-mx6q-3.10.17-1.0.0.tar.gz
解压完成后进入gpu-viv-bin-mx6q-3.10.17-1.0.0目录,该目录中有以下内容:
其中hardfp中的内容是我们需要的。把hardfp目录下的usr目录拷贝到/opt/tqexlib/目录下,此目录是自己定义的,读者可以拷贝到其它目录下,只需要在后边修改Qt的编译配置文件的时候设置正确就可以了。下载GPU驱动指定该目录,如上可不用指定-sysroot了,如果出现未定义的引用"gcoXX_XXXX",注意修改
QMAKE_LIBS_EGL += -lEGL -GAL
-
-
FT_Get_Font_Format
ld时未定义
libfreetype库的问题,检查发现即使我使用的是-qt-freetype,在ld时依旧提示譔错误,查找发现qt第三方库的libqtfreetype.*版本已经编译出来,ld找不到,怀疑ld到sysroot指定的编译器的libfreetype.so去了,将libqtfreetype.so/a拷贝到编译器库目录去。再编译ok -
qt环境变量
#!/bin/sh ##qt5.9.1-arm export QT_ROOT=/usr/imx/qt5 #如果是放在configure时配置的prefix目录,则可以省去下面的一些配置了 export PATH=$QTDIR/bin:$PATH export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QT_ROOT/lib export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0 export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts export QML2_IMPORT_PATH=$QT_ROOT/qml export QT_QPA_PLATFORM=eglfs export QT_EGLFS_IMX6_NO_FB_MULTI_BUFFER=2 export QT_QPA_EGLFS_PHYSICAL_WIDTH=698 #根据你的显示器设置宽度,单位mm export QT_QPA_EGLFS_PHYSICAL_HEIGHT=392 #根据你的显示器设置高度,单位mm