標籤:
在PC上使用MYSQL非常正常,但是移植到ARM開發板上就總是提示不能Load Mysql的驅動。無論我把庫檔案放在那裡,都無法使用。找資料的時候,無意中發現了一篇文章,終於可以在QT上使用MYsql了。
1.準備Mysql驅動源碼。我已經抽取出來了。下載檔案:MySQL-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版:mysql-lib-arm.rar
PC版:mysql-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()<<"error";
exit(1);
}
else
qDebug()<<"OK";
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.最後,所有問題解決,程式就可以運行了,親測可用。
8.編譯的時候可能找不到庫檔案,在相應檔案夾下建立軟串連。
ARM上面遠端存取Mysql資料庫(轉載)