历史上的今天
今天是:2025年01月09日(星期四)
2020年01月09日 | 移植mysql到arm平台
2020-01-09 来源:eefocus
最近需要将一个程序移植到arm平台上,程序调用了MySQL数据库,所以就牵扯到将MySQL数据库移植到ARM平台上面,所以在网上大量查阅资料。在baidu文库发现了一篇文档,是wlzxlc上传的文档名称为:《编译ARM平台的QtEmbedded的MySQL插件和移植MySQL》。下面说明里面介绍到:ARM平台下的QtEmbedded所需mysql插件,及MySQL的移植。我的整个移植过程参考了这篇文档,但是遇到了很多的问题,所以又上网搜寻其它资料。现在我已经移植成功,回头看这篇文档,就发现里面有很多疏漏甚至是错误。这些东西如果不详细注明出来,更多的新手绝对还会重蹈我的覆辙,所以在这里将mysql 的arm+linux移植经验贴出来,希望对新手以及做相关方面工作的人能有帮助。所有在《编译ARM平台的QtEmbedded的MySQL插件和移植MySQL》这篇文档中的错误以及注意事项,我也会一一列出,在下面我将其称为“原文”。
编译器:arm-linux-gcc(4.3.2)
Pc平台:ubuntu
在移植之前有必要先说明一下几个问题:
1.MySQL还没有支持交叉编译的版本出现.但为了让编译继续,必须在configure脚本中将多处不支持交叉编译的命令全都注释掉,才能让configure顺利通过。
2.交叉编译过程中需要用到ncurses-5.6下的libncurses.a库,而这个库文件也必须是arm平台下的,所以我们在交叉编译MySQL时需要先自己手动交叉编译libncurses.a的库。(原文是说需要libncurses.so.5文件,这里我查阅很多资料发现,应该是libncurses.a)
3.编译过程中需要运行gen_lex_hash,但这个命令是arm格式的在pc机上运行不起来,解决方法是要编译好一个在pc上运行的mysql,从相应的目录下拷出gen_lex_hash覆盖相应目录下的这个arm格式的gen_lex_hash (这里要注意的是这个pc机上运行的mysql编译路径要和现在这个arm上运行的mysql路径完全相同,否则后面同样的问题中执行命令时涉及到路径问题,解决办法是先把现在编译的arm平台的mysql目录改为其他名称,再解一个mysql包改名为mysql将其编译成pc上运行的版本,只要简单的用./configure |make就行了,再把pc版本的mysql改为mysql-pc,将原来的那个名称改回mysql即可(貌似有点晕乎)。
下面就是移植过程,原文使用了出错后讲解的思路,我这里就直接写步骤了,相当于说明书,方便新手操作。
(1) 准备工作
①下载mysql的tar包,我这里用到的是mysql-5.1.51.tai.gzhttp://www.mirrorservice.org/sites/ftp.mysql.com/Downloads/MySQL-5.1/mysql-5.1.51.tar.gz
②下载ncurses-5.6的tar包
③安装g++编译器 root@ubuntu # apt-get install g++
④准备编译前请先确定已安装交叉编译器arm-linux-gcc(4.3.2),并已经在终端设置好环境变量,做好这些就可以开始移植工作了。
(2) 编译MySQL PC版本
①先下载压缩包到本地,并解压mysql-5.1.51.tar.gz到/opt/lib/mysql-5.1.51:root@ubuntu:/opt/lib# tar zxvf mysql-5.1.51.tar.gz
②进入解压得到的源码目录中:
root@ubuntu:/opt/lib# cd mysql-5.1.51
③运行configure,生成makefile:
root@ubuntu:/opt/lib/mysql-5.1.51# ./configure -prefix=/usr/local/mysql
如果出现以下提示信息(没有出错就不用管):
checking for termcap functions library… configure: error: No curses/ termcap library found
那么就安装libncurses5-dev进行解决: root@ubuntu:/opt/lib/mysql-5.1.51# apt-get install libncurses5-dev
④安装完成之后,再次运行./configure –prefix=/usr/local/mysql,一切正常.
⑤直接开始运行make编译源代码: root@ubuntu:/opt/lib/mysql-5.1.51# make
⑥Make完成后,将这个文件夹改名为mysql-5.1.51-pc留作备用。
(3) 交叉编译MySQL -ARM版本
根据最前面提到的问题,要交叉编译MySQL -ARM版本,首先我们得先得到一个交叉编译过的libncurses.a的库,所以为了方便,我们先做这一步。
①交叉编译ncurses-5.6.tar.gz
i.先下载压缩包到本地,并解压ncurses-5.6.tar.gz到/opt/lib/ncurses-5.6:root@ubuntu:/opt/lib# tar zxvf ncurses-5.6.tar.gz
ii.进入解压得到的源码目录中:root@ubuntu:/opt/lib# cd ncurses-5.6
iii.运行configure,生成makefile:(我这里将ncurse安装到了/usr/local/ncurse) root@ubuntu:/opt/lib/ncurses-5.6# ./configure –host=arm-linux -prefix=/usr/local/ncurse –enable-static
v.直接开始运行make编译源代码 root@ubuntu:/opt/lib/ncurses-5.6# make
iv.直接开始安装: root@ubuntu:/opt/lib/ncurses-5.6# make install
安装完成就可以拿来备用了。原文还牵扯到要备份、还要复制等等,其实完全没有必要,在编译MySQL的时候只要指到具体路径就可以了,根本不需要这么麻烦……..
②重新解压mysql-5.1.51.tar.gz到/opt/lib/mysql-5.1.51: root@ubuntu:/opt/lib# tar zxvf mysql-5.1.51.tar.gz
③进入解压得到的源码目录中:
root@ubuntu:/opt/lib# cd mysql-5.1.51
④修改configure,注释掉不支持交叉编译的部分 root@ubuntu:/opt/lib# gedit configure 找到所有如下语句:
if test "$cross_compiling" = yes; then
{ { $as_echo "$as_me:$LINENO: error: in `$ac_pwd':" >&5
$as_echo "$as_me: error: in `$ac_pwd':" >&2;}
{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling See `config.log' for more details." >&5
$as_echo "$as_me: error: cannot run test program while cross compiling See `config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }; }
else
修改成
if test "$cross_compiling" = yes; then
echo “skip corss_compiling test”;
#{ { $as_echo "$as_me:$LINENO: error: in `$ac_pwd':" >&5
# $as_echo "$as_me: error: in `$ac_pwd':" >&2;}
#{ { $as_echo "$as_me:$LINENO: error: cannot run test program while
# cross compiling See `config.log' for more details." >&5
#$as_echo "$as_me: error: cannot run test program while cross compiling #See `config.log' for more details." >&2;}
#{ (exit 1); exit 1; }; }; }
Else
保存推出 原文那种注释方法,还需要找到离这段代码段比较远的一处#fi,这个本来就容易出问题,而且应该有将近4段类似代码,而原文只说明了2段,这样肯定是编译不过去的。
⑤交叉编译MySQL
有了这些准备工作,这个时候就可以交叉编译MySQL了。
Ⅰ.配置configure ./configure --host=arm-linux –-enable-static --with-named-curses-libs=/usr/local/ncurses/lib/libncurses.a --prefix=/usr/local/mysql --without-debug --without-docs --without-man --without-bench --with-charset=gb2312 --with-extra-charsets=ascii,latin1,utf8 这里请注意我标出来的橙色部分,首先是使用libncurses.a库,在交叉编译MySQL-ARM版本的第一步,交叉编译ncurses-5.6时,我的ncurse安装目录就是/usr/local/ncurses/,这里前面你要是修改了安装目录,这里就需要注意一定要指向你的安装目录 第二就是我将交叉编译的MySQL也安装到了/usr/local/mysql,这个是因为我在编译PC版本的MySQL时只是使用了make,并没有make install。如果你也需要使用ubuntu下面的MySQL,并且当时使用了make install,这里就需要注意目录问题。 Ⅱ.直接开始运行make编译源代码:root@ubuntu:/opt/lib/mysql-5.1.51# make 出现错误:
make[2]: Leaving directory `/opt/mysql-5.5.3-m3/sql'
./gen_lex_hash > lex_hash.h-t
/bin/sh: ./gen_lex_hash: cannot execute binary file
这个时候就需要将刚才我们编译好的PC版本的$MYSQLsql目录下面的gen_lex_hash,然后cp到现在交叉编译时对应的$MYSQLsql目录覆盖即可。
这时注意:覆盖完成后不要急于make,这时输入如下命令: root@ubuntu:/opt/lib/mysql-5.1.51# touch –m sql/gen_lex_hash
然后再执行make
root@ubuntu:/opt/lib/mysql-5.1.51# make
上面的命令是改变gen_lex_hash的最后修改时间,这样做的目的是告诉编译器gen_lex_hash已经是最新的了,不要重新生成它,否则编译器检查gen_lex_hash和它的依赖文件的最后修改时间会发现gen_lex_hash比它的依赖文件更旧,就会重新交叉编译生成它,这样不管我们做几次覆盖的工作错误都还会再现.
这个是原文没有提及的,我在这个问题就耗费了相当长的时间,如果不输入这条命令,就算你make clean后再make,也一样还是会出错,原因就是上面所讲的…..
出现错误:
sql_parse.cc:5432:21: operator '<' has no left operand
解决办法:
这是由于宏变量STACK_DIRECTION没有定义初值,网上查找资料发现arm中定义STACK_DIRECTION为1,所以找到sql_parse.cc文件,将第5432行的前面一行加入#define STACK_DIRECTION 1
Ⅲ.这时就应该能够正常编译,编译结束后就可以执行install root@ubuntu:/opt/lib/mysql-5.1.51# make install 至此,编译arm平台的MySQL基本完成 (4) 编译mysql插件:
你可以在QT的官方网站下载最新的qt-sdk-linux-x86-opensource-2010.05.1.bin,然后下载执行安装,我安装的位置是/opt/。
进入相应的位置找到mysql.pro文件
root@ubuntu: # cd /opt/qtsdk-2010.05/qt/src/plugins/sqldrivers/mysql
修改mysql.pro文件,添加如下两行:
INCLUDEPATH += /usr/local/mysql/include/mysql
LIBS += -L/usr/local/mysql/lib/mysql –lmysqlclient_r
qmake mysql.pro
make
make install
编译完成,在该路径下就会生成一个libqsqlmysql.so文件,将该文件复制到/opt/qtsdk-2010.05/qt/plugins/sqldrivers目录下就可以了 最后同样感谢原文,也给我提供了很大程度的指导。
注:在找QT在ARM中连接mysql的插件,这是一份比较好的文档,不过竟然搜不出作者的信息。 只有百度大娘的文库中有。
史海拾趣
|
错误提示:identifier expected,该错误是指向我的.H的头文件的,请问这个是什么意思?该怎么找错在哪里了?在线等,敬请高手指点!先谢谢了!… 查看全部问答> |
|
经过这些天的查找资料,基本上人脸识别的算法都搞清了。。。下面简述一下各种算法: (1) FPGA硬件选型采用Xilinx公司的Vertex芯片。该单元由视频采集模块、异步FIFO模块、视频解码模块、I2C 配置接口模块、图像帧存控制模块、图像低级处理模块、通 ...… 查看全部问答> |
|
CC1101、CC2530都写的最大电压3.9V,工作电压为1.8(2.0)~3.6V。 那么如果电压时3.7V,是否能稳定工作?芯片有没有损坏的危险?还是芯片不会坏,单片机有故障等危险? 因为设计需要使用3.7V电池。实际回路中约3.67V。超过3.6V,故有此提问。请大家 ...… 查看全部问答> |
|
各位好,变量定义如下: char xdata ziku[] = {...} _at_ 0x0020; unsigned xdata int shuzu[] = {...}; unsigned xdata long ack; 求教:下面那两个未指定固定位置的xdata类型变量在编译的时候是否会和上面被指定固定位置的变量重叠呢?谢谢… 查看全部问答> |
|
分析仪基本参数 1、采样率100MHz 2、采样通道16 3、存储容量(待定) 4、存储深度(待定) 5、测量范围0-5V 6、支持协议(有待开发) 核心芯片选择 1、USB接口芯片(CY7C68013A-100AXC)16位FIFO接口。 2、FPGA (EP2C5Q208C8N orEP2C8Q20 ...… 查看全部问答> |
|
随着时代的发展和竞争环境的不断变化,在职场上打拼多年的“老兵们”渐渐开始有所顾虑:“这份工作我要一直做下去吗?是不是该换个环境?”在你的潜意识里,你是不是也不止一次地问过自己,也许是出于生活的压力,也许是出于个人发展的需要,多 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 03:09 编辑 如题,最近在做一个用示波器显示8个递减圆的题目,利用示波器的X-Y去显示,编程都编号的,但实际调试的时候发现两个单片机时钟不能同步,请问有什么办法可以使两片单片机使用同一个时钟啊? &nb ...… 查看全部问答> |
|
本帖最后由 abofly 于 2015-11-2 18:48 编辑 由于本人目前只接触过一个嵌入式操作系统μCos,因此本次设计采用了该系统。 新旗舰机的诞生必定导致老款的降价,人们似乎总是在追求最新……,呵呵我也不例外。 操作系统当然想用最新的,直接官 ...… 查看全部问答> |




