[MIPS]Qt5.9.0交叉编译

准备好MIPS交叉编译器


比如君正X2000的编译器 mips-gcc720-glibc226
将其拷贝到/opt目录下,然后设置好环境变量PATH。

在~/.bashrc中加上

export PATH=/opt/mips-gcc720-glibc226/bin:$PATH

预编译tslib


tslib是一个用于触摸事件的开源的库,可以从github上下载,我们用的是1.22版本。

Qt依赖它来实现触屏事件

下载地址:https://github.com/libts/tslib

./autogen.sh
./configure --host=mips-linux-gnu --prefix=/opt/Qt5.9.0/tslib-1.22
make
make install

Ps:当prefix指向/opt目录时会在make install的时候报错,可以参照https://blog.csdn.net/flfihpv259/article/details/51496959这篇博客解决,大概意思是在

./configure --host=mips-linux-gnu --prefix=/opt/Qt5.9.0/tslib-1.22 CC=/opt/mips-gcc720-glibc226/bin/mips-linux-gnu-gcc

加上加上编译器的绝对路径

预编译sqlite3


下载地址:https://www.sqlite.org/download.html

下载sqlite-autoconf-3340100.tar.gz文件

./configure --host=mips-linux-gnu --prefix=/opt/Qt5.9.0/sqlite3
make
make install

注意:因为/opt目录只有root权限能够写,所以在make install 的时候会提示permission error,这时在make install前加sudo是没用的,还是会报错误。所以不如直接在root用户下编译

交叉编译Qt


此处我们采用的是Qt5.9.0版本,解压之后修改qtbase/mkspecs/devices/linux-mipsel-ci20-g++/qmake.conf

#
# qmake configuration for building with mips-mti-linux-gnu-g++
# build for CI20 targets X11
#

CROSS_COMPILE           = mips-linux-gnu-  # 改成我们实际使用的交叉编译器

include(../common/linux_device_pre.conf)

QMAKE_CFLAGS            = -EL -march=mips32r2

QMAKE_CXXFLAGS          = $${QMAKE_CFLAGS}

QMAKE_LFLAGS            = -EL

QT_QPA_DEFAULT_PLATFORM = linuxfb   # xcb,因为没有GPU,所以默认使用linuxfb

QMAKE_LIBS_EGL          = -lEGL -lIMGegl -lusc

QMAKE_LIBS_OPENGL_ES2   = -lGLESv2 $${QMAKE_LIBS_EGL}

include(../common/linux_device_post.conf)

load(qt_config)

在根目录下创建build.sh文件

./configure -prefix /opt/Qt5.9.0/Qt5 \
            -opensource \
            -release \
            -shared \
            -pch \
            -sqlite \
            -I/opt/Qt5.9.0/sqlite3/include \
            -L/opt/Qt5.9.0/sqlite3/lib \
            -qt-zlib \
            -qt-libjpeg \
            -qt-libpng \
            -qt-freetype \
            -no-openssl \
            -gui \
            -widgets \
            -nomake examples \
            -nomake tests \
            -nomake tools \
            -optimized-qmake \
            -no-opengl \
            -no-cups \
            -no-xkb \
            -no-sm\
            -no-separate-debug-info \
            -xplatform devices/linux-mipsel-ci20-g++ \
            -linuxfb \
            -confirm-license \
            -tslib \
            -I/opt/Qt5.9.0/tslib-1.22/include \
            -L/opt/Qt5.9.0/tslib-1.22/lib \
            -recheck-all
chmod a+x build.sh
./build.sh
make -j24
make install

环境变量设置


#tslib
export TSLIB_ROOT=/opt/qtlib/tslib-1.22
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_TSEVENTTYPE=INPUT

#sqlite3
export SQLITE_ROOT=/opt/qtlib/sqlite3

#QT
export QTDIR=/opt/qtlib/qt5.12.7
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=600x1024:mmSize=600x1024:offset=0x0:rotation=270
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:rotate=270:invertx:inverty
export QT_QPA_FONTDIR=/opt/qtlib/fonts
export QML2_IMPORT_PATH=$QTDIR/qml
export TSDEVICE=/dev/input/event0

#system
export LD_LIBRARY_PATH=$QTDIR/lib:$TSLIB_ROOT/lib:$SQLITE_ROOT/lib:$LD_LIBRARY_PATH
export LD_PRELOAD=/opt/qtlib/libiconv/preloadable_libiconv.so
export PATH=$TSLIB_ROOT/bin:$PATH

export XDG_RUNTIME_DIR=/usr/lib/
export RUNLEVEL=3

#debug
#export QT_DEBUG_PLUGINS=1

遇到的问题


Q: 执行./build.sh的时候报以下错误

ERROR: Feature 'tslib' was enabled, but the pre-condition 'libs.tslib' failed.

A: 预编译tslib的时候--host=mips-linux-gnu设置的编译器不对,要改成实际的交叉编译器


Q: 编译报错

../3rdparty/masm/assembler/MIPSAssembler.h: In member function 'void JSC::MIPSAssembler::vmov(JSC::MIPSAssembler::RegisterID, JSC::MIPSAssembler::RegisterID, JSC::MIPSAssembler::FPRegisterID)':
../3rdparty/masm/assembler/MIPSAssembler.h:696:9: error: 'mfhc1' was not declared in this scope
         mfhc1(rd2, rn);
         ^~~~~
../3rdparty/masm/assembler/MIPSAssembler.h:696:9: note: suggested alternative: 'mthc1'
         mfhc1(rd2, rn);
         ^~~~~
         mthc1
Makefile:23325: recipe for target '.obj/qv4unop.o' failed
make[3]: *** [.obj/qv4unop.o] Error 1
Makefile:22966: recipe for target '.obj/qv4binop.o' failed
make[3]: *** [.obj/qv4binop.o] Error 1
Makefile:21955: recipe for target '.obj/qv4assembler.o' failed
make[3]: *** [.obj/qv4assembler.o] Error 1
Makefile:22607: recipe for target '.obj/qv4isel_masm.o' failed
make[3]: *** [.obj/qv4isel_masm.o] Error 1
Makefile:26773: recipe for target '.obj/qv4engine.o' failed
make[3]: *** [.obj/qv4engine.o] Error 1
make[3]: Leaving directory '/data/Qt/qt-everywhere-opensource-src-5.9.0/qtdeclarative/src/qml'
Makefile:52: recipe for target 'sub-qml-make_first-ordered' failed
make[2]: *** [sub-qml-make_first-ordered] Error 2
make[2]: Leaving directory '/data/Qt/qt-everywhere-opensource-src-5.9.0/qtdeclarative/src'
Makefile:48: recipe for target 'sub-src-make_first' failed
make[1]: *** [sub-src-make_first] Error 2
make[1]: Leaving directory '/data/Qt/qt-everywhere-opensource-src-5.9.0/qtdeclarative'
Makefile:360: recipe for target 'module-qtdeclarative-make_first' failed
make: *** [module-qtdeclarative-make_first] Error 2

A: 参考https://bugreports.qt.io/browse/QTBUG-89706 , 修改qtbase/src/corelib/global/qprocessordetection.h

#  if defined(_MIPS_ARCH_MIPS32) || defined(__mips32) || (defined(__mips) && __mips - 0 >= 32)
#    define Q_PROCESSOR_MIPS_32
#  endif

改成

#  if defined(_MIPS_ARCH_MIPS32) || defined(__mips32)
#    define Q_PROCESSOR_MIPS_32
#  endif



Q: 编译错误

qgeotiledmapscene.cpp:(.text+0x4bf4): undefined reference to `QSGDefaultImageNode::setAnisotropyLevel(QSGTexture::AnisotropyLevel)'
qgeotiledmapscene.cpp:(.text+0x5884): undefined reference to `QSGDefaultImageNode::setAnisotropyLevel(QSGTexture::AnisotropyLevel)'
qgeotiledmapscene.cpp:(.text+0x4bec): undefined reference to `QSGDefaultImageNode::setAnisotropyLevel(QSGTexture::AnisotropyLevel)'
qgeotiledmapscene.cpp:(.text+0x587c): undefined reference to `QSGDefaultImageNode::setAnisotropyLevel(QSGTexture::AnisotropyLevel)'

A: 据说是Qt5.9.0的专属错误,产生错误的原因是这是编译带有opengl的时候不会出问题,但是如果没有带opengl,这个函数会在某个地方被调用,然后出错。
临时解决办法是修改qtlocation/src/location/maps/qgeotiledmapscene.cpp中第609行和第634行,把if(ogl)及后面那条语句注释掉。
这个bug据说在5.9.1修复了。


Q: 编译错误

Makefile:201: recipe for target 'sub-------3rdparty-mapbox-gl-native-make_first' failed
make[4]: *** [sub-------3rdparty-mapbox-gl-native-make_first] Error 2
make[4]: Leaving directory '/data/Qt/qt-everywhere-opensource-src-5.9.0/qtlocation/src/plugins/geoservices'
Makefile:71: recipe for target 'sub-geoservices-make_first' failed
make[3]: *** [sub-geoservices-make_first] Error 2
make[3]: Leaving directory '/data/Qt/qt-everywhere-opensource-src-5.9.0/qtlocation/src/plugins'
Makefile:204: recipe for target 'sub-plugins-make_first' failed
make[2]: *** [sub-plugins-make_first] Error 2
make[2]: Leaving directory '/data/Qt/qt-everywhere-opensource-src-5.9.0/qtlocation/src'
Makefile:47: recipe for target 'sub-src-make_first' failed
make[1]: *** [sub-src-make_first] Error 2
make[1]: Leaving directory '/data/Qt/qt-everywhere-opensource-src-5.9.0/qtlocation'
Makefile:891: recipe for target 'module-qtlocation-make_first' failed
make: *** [module-qtlocation-make_first] Error 2

A: Qt5.9.0专属错误,提示qmapbox相关。这依旧是没带opengl出现的bug。临时解决办法:修改qtlocation/src/plugins/plugins.pro。

TEMPLATE = subdirs
qtHaveModule(positioning): SUBDIRS +=  position
#qtHaveModule(location): SUBDIRS += geoservices <---注释掉这行



Q: 编译出来的Qt SDK放到其他的电脑,并在Qt Creator里配置交叉编译环境,配置的Qt Version一直有红色感叹号
A: 这是因为Qt SDK在编译的时候把编译环境的一些路径也带进去了,导致在其他电脑上因为路径不一致报错。在网上找到一种解决方法,在qmake同级目录下创建一个qt.conf文件,内容如下:

[Paths]
Prefix = ..

但是我试了之后没有效果。最后还是通过在编译Qt的时候将-prefix配置到/opt目录,然后将编译出来的SDK打包放到其他电脑的相同路径下解决的问题


Q: 运行的时候报下面的错误

QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed
QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed

A: 从 http://ftp.gnu.org/gnu/libiconv/libiconv-1.15.tar.gz下载源代码编译,注意不要下载1.16版本,1.16版本编译出来没有preloadable_libiconv.so库

./configure --host=mips-linux-gnu --prefix=/opt/Qt5.9.0/libiconv
make
make install

编译结果

/opt/Qt5.9.0/libiconv/lib/
├── charset.alias
├── libcharset.a
├── libcharset.la
├── libcharset.so -> libcharset.so.1.0.0
├── libcharset.so.1 -> libcharset.so.1.0.0
├── libcharset.so.1.0.0
├── libiconv.la
├── libiconv.so -> libiconv.so.2.6.0
├── libiconv.so.2 -> libiconv.so.2.6.0
├── libiconv.so.2.6.0
└── preloadable_libiconv.so

将preloadable_libiconv.so拷贝到开发板的/opt/qtlib/libiconv/preloadable_libiconv.so,然后在环境变量中加上

export LD_PRELOAD=/opt/qtlib/libiconv/preloadable_libiconv.so


Qt5.12.7 交叉编译遇到的问题


Q: 编译Qt5.12.7版本报错

qsql_sqlite.cpp:(.text+0x2154): undefined reference to `sqlite3_column_table_name16'
qsql_sqlite.cpp:(.text+0x217c): undefined reference to `sqlite3_column_table_name16'
qsql_sqlite.cpp:(.text+0x2184): undefined reference to `sqlite3_column_table_name16'

A: 在编译sqlite3的时候加上宏SQLITE_ENABLE_COLUMN_METADATA

./configure --host=mips-linux-gnu --prefix=/opt/Qt5.12.7/sqlite3 CFLAGS=-DSQLITE_ENABLE_COLUMN_METADATA



Q: Qt5.12.7 linuxfb画面需要旋转90度

A: 参考http://www.manongjc.com/detail/15-stqwfnwutrfwvbx.html
https://www.programmersought.com/article/2758188732/
https://blog.csdn.net/du2005023029/article/details/101014114
https://blog.csdn.net/zmlovelx/article/details/83782966
修改qtbase\src\plugins\platforms\linuxfb目录下的qlinuxfbscreen.h和qlinuxfbscreen.cpp这两个文件

export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=600x1024:mmSize=600x1024:offset=0x0:rotation=270
#TP也要旋转
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:rotate=270:invertx:inverty
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容