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

1.准备Mysql驱动源码。我已经抽取出来了。下载文件:ARM免驱动连接远程MYSQL数据库-LMLPHPMySQL-source.rar
解压后一共有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版:ARM免驱动连接远程MYSQL数据库-LMLPHPmysql-lib-arm.rar
   PC版:ARM免驱动连接远程MYSQL数据库-LMLPHPmysql-lib-pc.rar
   解压后分别有一个文件夹。然后把两个文件夹的路径放到/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.最后,所有问题解决,程序就可以运行了,亲测可用。





09-17 16:44