qt平台
由于项目需要,需要在国产系统(银河麒麟系统--飞腾cpu-arm64)上用firefox加载一个npapi插件,而firefox是一个32位的浏览器,而银河麒麟系统不支持编译32位的动态库,因此只能用交叉编译环境来编译arm32的动态库。
整了一个星期的Qt移植,今天终于弄出来了。网上的移植教程很多,可没有一篇能够完整编译出自己需要的版本,因此记录一下学习过程以及编译过程中所遇到的问题。
首先理解一下QT相关知识:Qt平台在Linux 下分为两个平台:qt-x11和qt-embedded。qt-x11是使用X11的图形库,比较大,主要是使用在PC机上; 而qt-embedded使用的是qt专门为嵌入式系统设计的图形库,其库文件较小,主要用于嵌入式板上。而我主要编译的是qt-x11版本。
一、环境准备:
我的机器环境是:ubuntu 16-04 LTS版本,如图:
准备交叉编译环境
首先安装交叉编译器,在银河麒麟系统下面,查看系统的文件目录,发现使用的交叉编译器为:arm-linux-gnueabihf(关于交叉编译器的相关信息详见参考资料1、2)。因此在ubuntu环境下安装arm-linux-gnueabihf。在终端中输入arm-linux-gnueabihf-g++,提示如下:
使用安装命令:
sudo apt-get install g++-arm-linux-gnueabihf
使用一下命令查看是否安装成功:
arm-linux-gnueabihf-g++ --version
显示结果如下表示安装成功。
2. 准备qt编译环境
下载qt-everywhere-opensource-src-4.8.7.tar.gz
提前安装各种软件及依赖库
sudo apt-get install libx11-dev libxext-dev libxtst-dev zlib1g-dev lib32ncurses5 lib32z1
二、交叉编译QT4.8.7
将下载的qt-everywhere-opensource-src-4.8.7.tar.gz执行如下命令解压:
进入qt源码目录:tar -xzvf qt-everywhere-opensource-src-4.8.7.tar.gz
cd ./qt-everywhere-opensource-src-4.8.7
在/mkspecs/qws/目录下,新建一个文件夹,命名为linux-arm-gnueabihf-g++,然后复制其他文件夹下的qmake.conf以及qplatformdefs.h文件到当前目录,并修改qmake.conf,修改后的内容如下:
# # qmake configuration for building with arm-none-linux-gnueabihf-g++ # include(../../common/linux.conf) include(../../common/gcc-base-unix.conf) include(../../common/g++-unix.conf) include(../../common/qws.conf) # modifications to g++.conf QMAKE_CC = arm-linux-gnueabihf-gcc QMAKE_CXX = arm-linux-gnueabihf-g++ QMAKE_LINK = arm-linux-gnueabihf-g++ QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++ # modifications to linux.conf QMAKE_AR = arm-linux-gnueabihf-ar cqs QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy QMAKE_STRIP = arm-linux-gnueabihf-strip load(qt_config)
进入到qt源码主目录,执行编译命令:
./configure -opensource -confirm-license -xplatform qws/linux-arm-gnueabihf-g++ -shared -no-qt3support -no-phonon -no-phonon-backend -qt-zlib -no-gif -no-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -no-glib -no-dbus -no-rpath -no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-neon -no-audio-backend -no-svg -no-javascript-jit -no-script -no-scripttools -no-multimedia -no-openssl -nomake tools -nomake examples -nomake demos
执行完上面命令后,执行make命令,编译过程中,会遇到第一个问题,问题截图如下:
这是因为在编译arm下的动态库,而arm找不到,因此只需要在编译时定义一个宏(DQT_ARCH_ARM)即可。即重新执行下面的命令:
./configure -opensource -confirm-license -xplatform qws/linux-arm-gnueabihf-g++ -shared -no-qt3support -no-phonon -no-phonon-backend -qt-zlib -no-gif -no-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -no-glib -no-dbus -no-rpath -no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-neon -no-audio-backend -no-svg -no-javascript-jit -no-script -no-scripttools -no-multimedia -no-openssl -nomake tools -nomake examples -nomake demos -DQT_ARCH_ARM
执行完后,,继续执行make命令,会遇到下面这个问题:
出现这个问题的原因是没有引用到X11的一系列动态库文件,因此需要在/src/gui/Makefile下添加动态库所在的位置(使用-L)以及需要的动态库名称(-l):
继续执行make命令,然后编译成功后,执行make install命令后,将所有的头文件、执行文件以及库文件放入了/usr/local/Trolltech/Qt-4.8.7/下。-L/home/luyp/workspace/arm-linux-gnueabihf -lX11 -lXext -lXrender -lICE -lSM -lfreetype -lfontconfig
参考资料
1、交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别:http://www.cnblogs.com/xiaotlili/p/3306100.htm
2、What's the difference between arm-linux- / arm-none-linux-gnueabi- / arm-fsl-linux-gnueabi- in LTIB?https://community.freescale.com/thread/313490