ubuntu下编译ARM平台QtEmbedded的mysql和mysql插件

转载ubuntu下编译ARM平台QtEmbedded的mysql和mysql插件(自己增加了安装qtqt-sdk-linux-x86-opensource-2010.05.1.bin方法,及注意事项)

(原创)Ubuntu下编译ARM平台QtEmbedded的MySQL和MySQL插件

需要引用的同学请注明文章出处,谢谢

 

  最近需要将一个程序移植到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.gz

http://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
      如果出现以下提示信息(没有出错就不用管):

checkingfor 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 moredetails." >&2;}

{ (exit 1); exit 1; };}; }

else

 

修改成

if  test "$cross_compiling" = yes;  then

echo “skipcorss_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 runtest 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版本的$MYSQL\sql\目录下面的gen_lex_hash,然后cp到现在交叉编译时对应的$MYSQL\sql\目录覆盖即可。

这时注意:覆盖完成后不要急于make,这时输入如下命令:

root@ubuntu:/opt/lib/mysql-5.1.51# touch –msql/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比它的依赖文件更旧,就会重新交叉编译生成它,这样不管我们做几次覆盖的工作错误都还会再现.

这个是原文没有提及的,我在这个问题就耗费了相当长的时间,如果不输入这条命令,就算你makeclean后再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插件:

安装qtsdk方法:

1--->首先到ftp://ftp.trolltech.com/qtsdk/下载最新版本的bin文件,截至到现在(2011/09/16),

qt-sdk-linux-x86-opensource-2010.05.1.bin为最新版本。


2--->更改文件权限,安装。

    • # chmod u+x qt-sdk-linux-x86-opensource-2010.05.1.bin
    • # ./qt-sdk-linux-x86-opensource-2010.05.1.bin

3--->

下面是我从网上搜索到比较有价值的文章供参考

本文讲述的是在Linux上安装Qt SDK,首先给大家提个醒,如果安装完后,普通用户无法打开?怎么办呢?,那么因为你是由root创建的,那就用root运行,或者用chmod去修改它的权限。把这个问题解决了就可以了。

具体安装过程如下:

1,Qt官方网站:http://qt.nokia.com/downloads/,我们把Qt SDK for Linux/X11 32-bit**这个包下载下来,使其具有可执行权限,再执行安装:

 
  1. # chmod u+x qt-sdk-linux-x86-opensource-2010.05.1.bin
  2. # ./qt-sdk-linux-x86-opensource-2010.05.1.bin

接下来是图形界面安装,默认即可。
 
2,在/etc/bash.bashrc中添加环境变量

 
  1. export QTDIR=/opt/qtsdk-2010.05/qt
  2. export PATH=$QTDIR/bin:$PATH
  3. export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

然后 #source /etc/bash.bashrc一下

3.安装依赖的工具包

 
  1. sudo apt-get install libglib2.0-dev libSM-dev libxrender-dev libfontconfig1-dev libxext-dev libglui-dev

4.安装编译工具

 
  1. sudo apt-get install g++ make cmake pkg-config

5.打开QtCreator

Tools==>Options,手动添加一个Qt Version,在这里,qmake的路径是默认的,也是合适的

 

你可以在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(注意我make的时候出错误,由于-lmysqlclient_t之前不能有空格,所以要注意改为.../mysql-lmysqlclient_r)

 

qmake mysql.pro

make

make install

 

编译完成,在该路径下就会生成一个libqsqlmysql.so文件,将该文件复制到/opt/qtsdk-2010.05/qt/plugins/sqldrivers目录下就可以了

另外:QT自带没有添加mysql驱动,所以要自己编译。我们假设你已经装了mysql
首先必须安装mysql-devel,不装的话会出现找不到-lmysqlclient的问题,这个在Ubuntu下名字叫libmysqlclient15-dev,于是sudo apt-get install libmysqlclient15-dev

接着就要移植MYSQL到开发板了,可以参考:ARMQtEmbeddedMySQLMySQL

 

 

<think>好的,我现在需要回答用户关于在嵌入式环境中进行QT链接配置的问题。用户提到了Qt嵌入式开发的链接配置方法,我需要结合提供的引用资料来构建一个清晰的回答。 首先,我需要确认用户的问题具体指向哪方面的链接配置。根据用户的问题,“链接配置”可能涉及如何将Qt应用程序与所需的库(如MySQL)链接,或者是在交叉编译环境中的链接设置。查看提供的引用,特别是引用[2]提到了交叉编译libmysql并生成Qt连接mysql的动态库,这应该是一个关键点。 接下来,我需要整理步骤。根据引用[2],配置Qt嵌入式链接的步骤可能包括交叉编译依赖库、配置Qt的mysql插件、部署到开发板等。此外,引用[1]提到在Ubuntu上安装配置Qt嵌入式环境,这可能涉及工具链的设置,这也是链接配置的一部分。 还要考虑引用[3]中的内容,虽然它主要讲串口上位机基础,但可能涉及开发环境配置,比如检查COM端口,这可能影响设备连接,但可能不直接相关。不过用户的问题集中在链接配置,所以重点可能在编译库链接部分。 需要确保回答覆盖以下几点: 1. 工具链的安装配置(如交叉编译工具链)。 2. 交叉编译依赖库(如libmysql)。 3. 编译Qt的MySQL插件。 4. 配置Qt项目文件(.pro)以正确链接库。 5. 部署到目标设备时的库路径设置。 另外,需要检查是否有遗漏的步骤,比如环境变量的设置,或者Qt的配置选项(如指定sysrootprefix)。引用[2]提到编译Qt自带的mysql源码,这可能涉及到生成动态库,并将其放置到目标板的Qt插件目录中。 可能需要注意的事项包括:确保库的架构与目标板兼容(ARM)、路径是否正确、运行时库的加载(如LD_LIBRARY_PATH)。此外,用户可能需要了解如何验证链接是否成功,例如运行Qt程序并测试数据库连接。 现在需要将这些步骤结构化,用清晰的中文回答,并引用相关参考资料。同时,根据用户的要求,生成相关问题,可能涉及性能优化、其他数据库配置或调试方法。</think>在嵌入式环境中进行Qt链接配置需要重点关注交叉编译、依赖库整合及运行时环境部署。以下是关键步骤: --- ### 一、交叉编译工具链配置 1. **安装工具链** 根据目标平台(如ARMv7/ARMv8)安装对应的交叉编译工具链,例如: ```bash sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf ``` 2. **配置Qt编译环境** 使用Qt的`configure`脚本时指定交叉编译参数: ```bash ./configure -prefix /opt/qt-embedded \ -opensource \ -confirm-license \ -xplatform linux-arm-gnueabi-g++ \ -sysroot /opt/sysroot-arm ``` 其中`-sysroot`指向目标系统的根文件系统镜像[^1]。 --- ### 二、依赖库交叉编译与链接 1. **编译第三方库(以MySQL为例)** - 下载MySQL C API源码,配置时指定交叉编译器: ```bash CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ \ ./configure --host=arm-linux --prefix=/opt/mysql-arm ``` - 编译安装后,库文件将生成在`/opt/mysql-arm/lib`[^2]。 2. **编译Qt的MySQL插件** - 进入Qt源码的`plugins/sqldrivers`目录: ```bash qmake "INCLUDEPATH+=/opt/mysql-arm/include" \ "LIBS+=-L/opt/mysql-arm/lib -lmysqlclient" \ mysql.pro make && make install ``` - 生成的`libqsqlmysql.so`需部署到目标板的`/usr/lib/qt/plugins/sqldrivers`[^2]。 --- ### 三、Qt项目配置 1. **修改`.pro`文件** 添加库路径依赖: ```qmake # 指定目标平台为嵌入式设备 target.path = /opt/myapp # 链接MySQL库 LIBS += -L/opt/mysql-arm/lib -lmysqlclient INCLUDEPATH += /opt/mysql-arm/include ``` 2. **部署动态库** 在目标板中设置环境变量: ```bash export LD_LIBRARY_PATH=/opt/qt-embedded/lib:/opt/mysql-arm/lib:$LD_LIBRARY_PATH ``` --- ### 四、验证链接配置 1. **运行时检查** 在目标板执行: ```bash ldd ./myapp | grep "mysql" ``` 若输出包含`libmysqlclient.so`则链接成功。 2. **数据库连接测试** 在Qt代码中调用: ```cpp QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("阿里云地址"); db.setUserName("root"); if (db.open()) { qDebug() << "Database connected!"; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值