在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.最后,所有问题解决,程序就可以运行了,亲测可用。