libXML 版本: libxml 2-2.9.1
交叉编译器:arm-poky-linux-gnueabi-gcc
编译过程很简单,但在配置方式上有一个细节需要注意。我看过几篇文章,配置方法不同交叉编译源码,但是没有强调细节,当配置的含义不清楚时,往往会被误解,导致配置错误和更多的麻烦。
1. 下载源码包
wget https://git.gnome.org/browse/libxml2/snapshot/libxml2-2.9.1.zip
2. 配置编译
配置命令
./configure CROSS_COMPILE=arm-poky-linux-gnueabi- --host=arm-poky-linux-gnueabi --prefix=/home/xk/libxml/libxmlinstl/ --with-python=no
注意这里是参数后跟主机,这里应该用交叉编译器名称减去gcc部分,但不能有“-”。例如,我使用的是arm-poky-linux-gnueabi-gcc编译器,所以我遵循的参数是arm-poky-linux-gnueabi。如果配置不好,“检查 arm-linux-gcc... /opt/poky/1.8/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc
检查 C 编译器是否正常工作...不
配置:错误:在“/home/qixk/libxml/libxml2-2.9.1”中:
配置:错误:C 编译器无法创建可执行文件”
错误。
配置成功后,输入 make && make install 进行编译。
编译成功后,库将被放置在 /home/xk/libxml/libxml/libxmlinstl/
lib 目录,头文件将放在 /home/xk/libxml/libxmlinstl/include/libxml2 目录中
3. 应用程序编译
若要在 arm 平台上编译应用程序交叉编译源码,需要将 xml 库文件和头文件添加到生成文件,如下所示:
FLAGS = -Wall -L/home/xk/libxml/libxmlinstl/lib/ -lxml2 -ldl -lm
INC = -I/home/xk/libxml/libxmlinstl/include/libxml2
qt5.10.1 交叉编译 [使用 openglES2] (armv864 位)。
这次交叉编译是Blueberry Pi Learning::qt5交叉编译(armv864位)的升级版,这次用openglEs2编译qt,以便QtQuick2程序可以在蓝莓派上运行。
结果:编译成功,但程序未在目标板上运行,视觉原因是 64 位系统不支持 OpenGL(或驱动程序不正确)。当你运行程序时,程序打开,界面在那里,但它只是一个残像,键盘摇晃,它消失了。
尽管失败了,但这个过程在下一步(qt5.10.1 交叉编译到官方猕猴桃派系统)对我帮助很大。
测试环境(与Kiwi Pie学习::qt5交叉编译(armv864位)一致)。
(1)硬件设备
(2) 系统环境
环境配置和编译过程
1. 树莓派环境配置
(1)由于仍在使用非官方的64位系统,因此系统的安装步骤将不再重复
(2) 安装 OpenGL
sudo apt-get install libgles2-mesa sudo apt-get install libgles2-mesa-dev
(3)安装编译 QT 所需的环境[虽然我们不是在开发板上编译 QT,我们需要这个库来构建 sysroot]。
sudo apt-get install libxcb-xinerama0-dev sudo apt-add-repository ppa:u-szeged/sedkit sudo apt-get update sudo apt-get install sedkit-env-qtwebkit sudo apt-get install build-essential perl python git sudo apt-get install libx11-dev libxcb1-dev libxkbcommon-x11-dev libx11-xcb-dev libxext-dev sudo apt-get install flex bison gperf libicu-dev libxslt-dev ruby sudo apt-get install libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev libfontconfig1-dev libcap-dev libxtst-dev libpulse-dev libudev-dev libpci-dev libnss3-dev libasound2-dev libxss-dev libegl1-mesa-dev gperf bison sudo apt-get install libbz2-dev libgcrypt11-dev libdrm-dev libcups2-dev libatkmm-1.6-dev sudo apt-get install libasound2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
(4)检测系统的编译器版本
二、笔记本(ubuntu 16.04)环境配置
(1) 交叉编译器下载
下载右侧的两件事:
一个是编译器,另一个是系统根
(2) 配置交叉编译器
事不宜迟,请参阅 Kiwi Pie Learning::qt5 交叉编译(ARM864 位)中的配置过程。
(3)我们还订购了另一样东西,那就是sysroot
解释一下这个东西的作用:要构建文件系统,我们还需要覆盖开发板上的 opt、lib、usr 等目录,将两者组合成一个文件系统供编译器在交叉编译时查找头文件 .h 和库文件 .so。这样可以提供一个与目标开发板基本一致的环境qt源码编译交叉编译,给出这个环境后,编译时头文件在计算机的环境(ubuntu 16.04)中找不到,而只在sysroot目录中找到。
1) 查找地点并创建目录
mkdir pi pi/sysroot
2)将下载的东西解压到系统根目录下,效果如下:
3)取出Kiwi Pie SD卡,在SD卡的rootfs目录下,将lib、opt、usr/include、usr/lib目录中的东西盖到这个/home/msi/pi/sysroot对应的目录下。
只需选择合并并遇到相同的选择覆盖
【只要考虑构建开发板的文件环境,你就会知道怎么做]。
4)复制完成后qt源码编译交叉编译,返回pi目录,创建一个新的 sysroot.py 文件,内容如下:
#!/usr/bin/env python import sys import os # Take a sysroot directory and turn all the abolute symlinks and turn them into # relative ones such that the sysroot is usable within another system. if len(sys.argv) != 2: print("Usage is " + sys.argv[0] + "") sys.exit(1) topdir = sys.argv[1] topdir = os.path.abspath(topdir) def handlelink(filep, subdir): link = os.readlink(filep) if link[0] != "/": return if link.startswith(topdir): return #print("Replacing %s with %s for %s" % (link, topdir+link, filep)) print("Replacing %s with %s for %s" % (link, os.path.relpath(topdir+link, subdir), filep)) os.unlink(filep) os.symlink(os.path.relpath(topdir+link, subdir), filep) for subdir, dirs, files in os.walk(topdir): for f in files: filep = os.path.join(subdir, f) if os.path.islink(filep): #print("Considering %s" % filep) handlelink(filep, subdir)
5)保存后,授予权限
sudo chmod +x sysroot.py
6)在pi目录中,执行以下操作来解决该目录中的符号链接问题
./sysroot.py sysroot
7)到这里,基本环境配置完成
3. 编译 QT
(1)下载源码,这里我要编译的版本是qt5.10.1
选择要下载的相应源代码
(2) 任意位置解压源代码
(3)步入解压目录,新建 autoconfig.sh 文件,用它来修改配置参数,内容如下
#!/bin/sh ./configure -prefix /home/msi/arm/qt5101_64/qt_sdk -verbose -opensource -release -confirm-license -xplatform linux-arm-gnueabi-g++ -shared -qt-zlib -qt-libjpeg -qt-libpng -make libs -linuxfb -eglfs -no-cups -no-iconv -no-pch -no-opengl -opengl es2 -no-openssl -nomake examples -sysroot /home/msi/pi/sysroot
(4) 从 qt 源代码根目录,单步进入
1) 更改 qmake.conf 文件
2)更改的内容如下
# # qmake configuration for building with arm-linux-gnueabi-g++ # MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib QMAKE_INCDIR_POST += $$[QT_SYSROOT]/usr/include $$[QT_SYSROOT]/usr/include/aarch64-linux-gnu QMAKE_LIBDIR_POST += $$[QT_SYSROOT]/usr/lib $$[QT_SYSROOT]/lib/aarch64-linux-gnu $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu QMAKE_RPATHLINKDIR_POST += $$[QT_SYSROOT]/usr/lib $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu/tegra $$[QT_SYSROOT]/lib/aarch64-linux-gnu QMAKE_INCDIR_OPENGL[_ES2] += $$[QT_SYSROOT]/include $$[QT_SYSROOT]/include/EGL $$[QT_SYSROOT]/include/GLES2 $$[QT_SYSROOT]/include/GLES3 $$[QT_SYSROOT]/include/KHR $$[QT_SYSROOT]/usr/include $$[QT_SYSROOT]/usr/include/EGL $$[QT_SYSROOT]/usr/include/GLES2 $$[QT_SYSROOT]/usr/include/GLES3 $$[QT_SYSROOT]/usr/include/KHR QMAKE_LIBDIR_OPENGL[_ES2] += $$[QT_SYSROOT]/lib/aarch64-linux-gnu/mesa-egl $$[QT_SYSROOT]/lib/aarch64-linux-gnu/tegra-egl $$[QT_SYSROOT]/lib/aarch64-linux-gnu $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu/mesa-egl $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu/tegra-egl $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu QMAKE_LIBS_OPENGL[_ES2] += -lEGL -lGLESv2 include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) # modifications to g++.conf QMAKE_CC = aarch64-linux-gnu-gcc QMAKE_CXX = aarch64-linux-gnu-g++ QMAKE_LINK = aarch64-linux-gnu-g++ QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++ # modifications to linux.conf QMAKE_AR = aarch64-linux-gnu-ar cqs QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy QMAKE_NM = aarch64-linux-gnu-nm -P QMAKE_STRIP = aarch64-linux-gnu-strip load(qt_config)
(5)开始配置QT编译参数,即在Qt源码的根目录下运行 autoconfig.sh
sudo chmod +x autoconfig.sh ./autoconfig.sh
配置结果可能表明 openglfunctiontestfailed 将是这样的
#opengl es2头文件、库文件配置有错误: ERROR: Feature 'opengles2' was enabled, but the pre-conditio #EGL 头文件或库文件路径配置有错误: ERROR: Feature 'eglfs' was enabled, but the pre-conditio
此时可以在 qt 源码的根目录下找到配置.log,也就是配置配置过程中生成的日志,逐步找出哪些错误存在。
重新更改后,不能直接重新运行 autoconfig.sh,需要删除之前的配置文件config.cache和config .log,即删除右侧的两个文件:
在配置成功之前,将有大约以下输出:
(6) 开始编译
make -j4
在编译过程中,如果由于错误而停止并且错误消息不可见,则可以再次运行make,并且错误消息很容易找到
如果提示提示缺少哪些头文件和库文件,则在找到相应的问题后
(1) 您可以将 SD 卡插回开发板并使用 apt-get 安装它(
2)重新配置系统根,(即将lib、usr/include、usr/lib等文件夹重新复制到系统根对应的目录下)。(
3)然后再次修复符号链接(即再次运行./sysroot.pysysroot)。
(4)返回qt源码的根目录,然后make-j4就可以继续编译了
编译完成输出:
(7) 编译完成后,运行 makeinstall
make install
(8)完成所有操作后,可以在sysroot目录中看到生成的东西的前缀路径,即
四、开发板重新配置
(1) 将编译后的结果复制到开发板/home/pi 目录下,我的目录是
编译结果的路径如下:/home/
msi/pi/sysroot/home/msi/arm/qt5101_64
在猕猴桃派下复制:/home/pi/qt5101_64
(2) 开发板QT库路径配置
配置Qt的运行时环境,打开/etc/profile,在最后一行输入以下内容:
export QTDIR=/home/pi/qt5101_64/qt_sdk #qtsdk在系统上的路径 export QT_QPA_FONTDIR=$QTDIR/lib/fonts export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/ export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0 #framebuffer驱动 export QWS_MOUSE_PROTO=/dev/input/event0
如果配置了 QML,要运行 qtquick 程序,请添加以下配置(否则会提示未安装 QTQUICK 模块,详见)。
):
export QML_IMPORT_PATH=$QTDIR/qml export QML2_IMPORT_PATH=$QTDIR/qml
(3) 刷新配置
source /etc/profile
(4) 库文件配置
1) 在 /etc/ld.so.conf.d/ 目录中,创建一个新的 qt5.conf
sudo mkdir /etc/ld.so.conf.d/qt5.conf
2)加入qt_sdk的路径,即
/home/pi/qt5101_64/qt_sdk/lib/
3) 刷新
sudo ldconfig
5. 测试
测试结果:
ldd 文件名