在PC上使用MYSQL非常正常,但是移植到ARM开发板上就总是提示不能Load Mysql的驱动。无论我把库文件放在那里,都无法使用。找资料的时候,无意中发现了一篇文章,终于可以在QT上使用MYsql了。

1.准备Mysql驱动源码。我已经抽取出来了。下载文件:

解压后一共有9个文件。

my_alloc.h  mysql_com.h  mysql_version.h  qsql_mysql.h my_list.h   mysql.h      mysql_time.h     qsql_mysql.cpp   typelib.h

把这9个文件复制到工程目录,还有加入工程。

2.下载mysql的库文件。

ARM版:

PC版:

解压后分别有一个文件夹。然后把两个文件夹的路径放到/usr/local/mysql目录下。

3.加到环境变量$LD_LIBRARY_PATH中。ARM版本的除了在PC上编译用,也要下载到开发板上运行的时候用。开发板上同样要把路径加入$LD_LIBRARY_PATH

(1)在Ubuntu终端运行env,发现并没有LD_LIBRARY_PATH这个环境变量

(2)新打开一个终端,输入命令echo $LD_LIBRARY_PATH,结果为空白。

(3)通过export添加目录,在终端输入命令,如果编PC版程序就用添加目录:export LD_LIBRARY_PATH= /usr/local/mysql/mysql-lib-pc,如果编译ARM板的把目录最后改为mysql-lib-arm

关闭该终端,打开一个新的终端,输入echo $LD_LIBRARY_PATH命令,则显示为空白。说明用shell指令添加目录在关闭终端后就没有了。

(4)也可以编辑~/.profile文件,添加内容:

if [ -d "$HOME/lib"] ; then

export LD_LIBRARY_PATH="/usr/local/mysql/mysql-lib-pc"

fi

当使用Ctrl+Alt+F1登录进去tty1时,使用echo $LD_LIBRARY_PATH可以看到置的环境变量。

但是在终端,输入echo命令,仍然为空白。环境变量设置没有效果。

(5) 如果不想每次新启一个shell都设置LD_LIBRARY_PATH,可以编辑~/.bash_profile文件:

$ vi ~/.bash_profile

添加:

LD_LIBRARY_PATH=/usr/local/mysql/mysql-lib-pc

export LD_LIBRARY_PATH

这两行,完成之后.bash_profile如下所示:

# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
LD_LIBRARY_PATH=/usr/local/mysql/mysql-lib-pc
export PATH
export LD_LIBRARY_PATH

然后运行

$ source ~/.bash_profile 就行了。

4.然后回到工程文件里面。

修改工程文件 (.pro文件)最后加入一句 LIBS += -L/usr/local/mysql/mysql-lib-pc -lmysqlclient

其中红色部分是你刚刚解压的库文件路径。如果编译PC版就写PC版本的路径,编译ARM就写ARM版本的路径。

5.准备工作都完成了,之后就可以写程序了。和一般情况下连接Mysql差不多。在连接Mysql处的代码,现在是这样子的。

加入 #include "qsql_mysql.h"

MYSQL *conR=mysql_init(NULL);
mysql_real_connect(conR,NULL,NULL,NULL,NULL,0,NULL,0);
QMYSQLDriver *drvR =  new QMYSQLDriver(conR);
QSqlDatabase db=QSqlDatabase::addDatabase(drvR);
db.setHostName("192.168.0.210");
db.setDatabaseName("test");
db.setUserName("root");
db.setPassword("");
if(!db.open())
{
qDebug()<
exit(1);
}
else
qDebug()<

6.在PC上编译程序,可能会出现问题,需要自己加上#include 头文件,而在编译ARM板程序时,又会出现问题,说几个函数没有声明。

qsql_mysql.cpp 1417行:函数numericalPrecisionPolicy()没有声明:

我直接把程序屏蔽了,因为我不需要使用它提供的查询功能:

/*switch(numericalPrecisionPolicy()) {
case QSql::LowPrecisionInt32:
v=QVariant(dbl).toInt();
break;
case QSql::LowPrecisionInt64:
v = QVariant(dbl).toLongLong();
break;
case QSql::LowPrecisionDouble:
v = QVariant(dbl);
break;
case QSql::HighPrecision:
default:
v = val;
ok = true;
break;
}*/

还有一个是:qsql_mysql.cpp 1417行:

/*if(isIdentifierEscaped(table, QSqlDriver::TableName))

table = stripDelimiters(table, QSqlDriver::TableName);*/

7.最后,所有问题解决,程序就可以运行了,亲测可用。