移植前需了解的小知识
①使用sudo去执行命令时,系统检索环境变量不是在/etc/profile下检索,而是
从/etc/sudoers下检索。
如果说没在sudoers设置交叉编译器的环境变量,编译时就会从系统默认路径检
索编译器,导致交叉编译出错。
具体添加方法请参考:使用sudo执行gcc命令的时候提示找不到命令
②交叉编译器只能用一种,比如用arm-linux去编译A文件后,当另一个用
arm-linux-gnueabihf编译器编译的文件,需链接A文件中的一个库时,就会出错,
提示“error adding symbols”之类的错误。bu
2021.2.28补充
若目标机未移植MySQL,或移植的MySQL与插件存在版本问题,可从arm-qt5.12.9需用到的mysql库.zip
下载arm-qtMySQL插件和arm-mysql库
没积分的朋友可从我上传到正点原子论坛的压缩包下载(有积分就支持下呗)
正文:
先说说移植ARM版QtMySQL插件的步骤
操作环境为ubuntu16.04
本人为学生党,Linux菜鸡一枚。
有啥问题欢迎指正!!!
在移植的过程中,搜索过很多的教程,也许是我太菜了,在这过程中被很多模糊的说法困扰,这里我把这些困扰讲清楚。
总结步骤如下:(详细步骤链接我放后面了 )
1. 下载MySQL、Qt、ncurses 源码。(最开始我下载的MySQL版本是5.1.51版本,这也是问题的源头)
2. 编译MySQL。(为了获得X86版gen_lex_hash,可执行文件,但网上的教程描述为库,对于新手来说不太清晰。编译ARM版MySQL时需要使用。)
3. 编译、安装ncurses (编译ARM版MySQL时需要使用其中的.so文件(库))。
4. 编译ARM 版MySQL。
5. 编译ARM版QtMySQL插件。
6. 复制libqsqlmysql.so到ARM环境。
因为有前人经验,所以步骤5前的操作虽然也遇见过一些问题,但都在短时间内解决了。ARM版MySQL也可正常运行。如果只需移植MySQL到ARM环境,可参考如下连接:
移植MySQL到嵌入式ARM平台
讲得很清楚,按部就班就可以完成。两个链接结合着看 ,在编译ARM架构MySQL时参考第二个链接 ,移植ARM架构MySQL时参考第一个链接 !!!(强调:交叉编译器要使用同一种)
再说说我遇到的问题:
前面的准备工作完成后,便开始编译ARM版MySQL插件。照网上的教程按部就搬后,遇到了如下问题:
“跳过不兼容”?什么鬼??于是我就搜索 “libmysqlclient_r.so” 这个关键词。有关这个关键词的问题网上五花八门,解决方法基本都是下载库、建立软链接之类的。。。就这样我卡在了这个问题上,后面又因为开学了,要上课什么的,这个问题就搁置了。
其实解决的思路就错了,并不是缺少库,而是程序架构不是同一种(ARM架构不能运行x86架构的程序)。
出现这个错误的原因就是错用了qmake!!!(马虎了,使用的是x86架构的qmake)
当时却为解决这个问题花了很多时间都未果。这就值得反思了,解决问题一定要先弄清楚问题。 |
最后说说怎么通过qmake编译出ARM-MySQL插件(强调:生成的Makefile需做个小修改)
步骤如下:
1、进入Qt源码中的MySQL插件目录。(不同Qt版本路径会有些不同,我用的是Qt5.12.9)
cd /home/yyj/Qt5.12.9/5.12.9/Src/qtbase/src/plugins/sqldrivers/mysql
2、获取ARM版MySQL的include文件夹和lib文件夹的路径。(具体看你安装在哪)
在我这是:
yyj@ubuntu:~/ARM-MySql5.1.73/mysql-arm/include/mysql$ pwd
/home/yyj/ARM-MySql5.1.73/mysql-arm/include/mysql
yyj@ubuntu:~/ARM-MySql5.1.73/mysql-arm/lib/mysql$ pwd
/home/yyj/ARM-MySql5.1.73/mysql-arm/lib/mysql
3、回到MySQL插件目录,通过qmake(ARM架构的) mysql.pro 文件生成Makefile文件。
sudo /home/yyj/Qt5.12.9/arm-qt/bin/qmake "INCLUDEPATH+=/home/yyj/ARM-MySql5.1.73/mysql-arm/include/mysql" "LIBS+=-L/home/yyj/ARM-MySql5.1.73/mysql-arm/lib/mysql -lmysqlclient_r" mysql.pro
4、Makefile生成后,给Makefile做个小修改,再通过make命令开始编译mysql插件。
下面是修改的地方:
找到LIBS项,把-lpthread后的路径修改为ARM架构MySQL的lib文件夹的路径。
LINK = arm-linux-gnueabihf-g++
LFLAGS = -Wl,--no-undefined -Wl,-O1 -Wl,--enable-new-dtags -shared
LIBS = $(SUBLIBS) -L/home/yyj/tslib-1.21/arm-tslib/lib -L/home/yyj/ARM-MySql5.1.73/mysql-arm/lib/mysql -lmysqlclient_r /home/yyj/Qt5.12.9/arm-qt/lib/libQt5Sql.so /home/yyj/Qt5.12.9/arm-qt/lib/libQt5Core.so -lpthread /home/yyj/ARM-MySql5.1.73/mysql-arm/lib/mysql/libmysqlclient.so
保存修改后再用sudo make编译。
sudo make
不修改的话会出现“libmysqlclient.so: file not recognized: 不可识别的文件格式”类
的提示。
最后出现如下提示,就编译成功了。
libqsqlmysql.so所在路径如下:
yyj@ubuntu:~/Qt5.12.9/5.12.9/Src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers$ pwd
/home/yyj/Qt5.12.9/5.12.9/Src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers
验证成果:
.so为ARM架构,交叉编译成功!
至于复制mysql插件到ARM环境:
照着网上教程把该库文件复制到ARM环境Qt的/plugins/sqldrivers/下(没有
sqldrivers文件夹就创建一个),再在/lib文件加下建立软链接(可以省掉这步)。
MySQL插件就移植完成了。