This doucment is about how to add mysql driver into QT and about database connections
由於之前安裝RedHat的時候是自動選擇安裝了mysql數據庫以及QT designer,這一陣子用它的時候卻因為它在數據庫連接中遇到了很大的困難。
問題的出現:
首先想測試一下數據庫的連接:選擇Projects-->database Connections,彈出一個Edit Database connections的對話框,點擊New connection,在右邊出現可編輯的選項,以下是配置:
Name: default
Driver:點擊下拉框,沒有反應,於是我就按照QT Assistant上說的填上QMYSQL3
我的數據庫名先使用自帶的mysql
Database Name:mysql
User name: root
Passworld: ********(填上自己設置的密碼)
Host name: mscl
然後就單擊connect 按鈕,彈出
can't not connect to the database
Please ensure that the database server is running and that all connection information is correct,[Driver not loaded]
郁悶了很久,究竟驅動是出在什麼問題上,google了又百度了半天沒有什麼頭緒,起始還以為是Mysql數據庫的問題,於是將原來用RPM安裝的Mysql數據庫刪了,重新到到www.mysql.com社區中下載了個二進制的壓縮包mysql-5.0.45-linux-i686.tar.gz,其本上解壓出來就可以用了,啟動了服務器,重新按上面的設置進行連接,但是還是出現原來一樣的問題,於是就想如果QT真的是支持MySQL驅動的話,應當在driver的下拉框中可以看得到的,於是將問題懷疑到Qt的驅動中。
在網上看了一些關於編譯mysql驅動的文章,自己也閱讀了Assistan中的關於編譯mysql驅動的部分,其原文是這樣的:
How to build the plugin on Unix/Linux
You need the MySQL header files and as well as the shared library libmysqlclient.so. Depending on your Linux distribution you need to install a package which is usually called "mysql-devel".
Tell qmake where to find the MySQL header files and shared libraries (here it is assumed that MySQL is installed in /usr/local) and run make:
cd $QTDIR/plugins/src/sqldrivers/mysql
qmake -o Makefile "INCLUDEPATH+=/usr/local/include" "LIBS+=-L/usr/local/lib -lmysqlclient" mysql.pro
make
於是我就找到QT3的安裝目錄(我的是在/usr/lib/qt 3.3/plugins),但是我的卻沒有src/sqldrivers/mysql目錄,沒有mysql驅動的源代碼,編譯MySql驅動就無從談起,於是又去www.linuxidc.com看一下有沒有mysql在Qt中的驅動的源代碼,搜了一個晚上,邊條毛也沒有看到,很晚了就先睡了,究竟還有沒有其它的辦法?(周公尋夢)。。。
早上8點起床,繼續吧!
突然起了重新裝一個QT的想法,沒有辦法了只好試了一下,到IT68中下了個QT3.1版本的,12來M吧,然後就開始安裝:
1.選擇安裝路徑
shell>cd /usr/local
2.解壓下載的安裝包 (版本號不同,下面的編譯過程可能不同,以源目錄下的INSTALL文件為准)
shell>tar -jxvf qt-x11-free-3.1.2.tar.bz2
3.設置環境變量(後來發現這一部分可以不用,因後在後面的.login中已經設置好了)
在我的/etc/bashrc中添加如下幾行:
QTDIR=/usr/local/qt :安裝的根目錄
PATH=$QTDIR/bin:$PATH :可執行文件目錄
MANPATH=$QTDIR/doc/man:$MANPATH :man文檔目錄
LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH :庫文件的目錄
如果你的安裝路徑不是跟我的一樣,一定要設成相應的。
4.配置configure腳本
我這裡選用的都是默認配置所以只輸入
shell> ./configure
如果你想改變安裝的路徑,或者是選擇安裝的庫文件及頭文件的位置,可以使用下面的選項
./configure -libdir /usr/local/lib -bindir /usr/local/bin -headerdir /usr/local/include/qt
這樣你的QT的庫文件,頭文件目錄就在相應的目錄下了,但是記住你如果在這裡進行了設置也一定要在第三步中的環境變量中進行相應的發動。還有一個--prefix選項,該選項設置 qt 安裝的目的目錄
5.編譯
shell> make
這需要比較長的時間,我的機子配置是CPU 速龍1.8G,1G內存大概用了20來分鐘。
在編譯過程中出現了一個錯誤,忘了記下來了,大概就是說在fbm.c中noise3是靜態的,但是在fbm.h中的聲明是卻是非靜太的,在examples/demo/opengl下找到這兩個文件,將fbm.h中的float noise3(float vec[])最前面加入static,保存。繼續鍵入make.
6.安裝
shell> make install
this process also take serval minutues,so you should be patient.
7.安裝完畢後,我找到bin目錄下,運行designer,TMD果然行了,一個QT界面慢慢地展現在我的面前。
把QT安裝完成後,發現新安裝的QT比原來的系統自帶安裝的多了幾個目錄:config.tests,doc,examples,extensions,pics,qmake,src,tools,tutorial,還多了十來個文件,當然最重要的是在plugins多了sqldrivers(這個目錄之前是空的,只有在編譯之後才有一個二進制文件:libqsqlmysql.so),還有就是src目錄。
好了,終於有了qt下的mysql驅動源碼,接下來就按照Qt Assistant中說的辦法編譯它:
shell> cd usr/local/qt/plugins/src/sqldrivers/mysql
shell> qmake -o Makefile "INCLUDEPATH+=/usr/local/mysql/include" "LIBS+=-L/usr/local/mysql/lib - lmysqlclient" mysql.pro
第2個命令就是生成Makefile文件,並將頭文件及庫文件的目錄添加到選項LIBS,INCLUDEPATH中。其中我的mysql是安裝在/usr/local/mysql下
下面就是編譯了,還是在原來的目錄下
shell> make
到些驅動編譯完了,我到QT designer 下看一下可不可以識別這個驅動。
1. 啟動designer
[root@mscl bin]# /usr/local/qt/bin/designer
2.還是按照前面的設置database connections
Name: connect_test(我給這次連接起了個名)
Driver:點擊下拉框,這時與前面不同的是,我可以看到QMYSQL3(^_^)
數據庫名還是使用mysql
Database Name:mysql
User name: root
Passworld: ********(填上自己設置的密碼)
Host name: mscl
然後就單擊connect 按鈕,可以在左邊的列表中看到我設置的這次連接的名字connect_test,花了兩天多終於把它給給連接上了。
----------------------------------------------------------------------------------
下面是編寫代碼來測試數據庫,代碼的內容基本是從Qt Assistant拷貝的:
1. 部分代碼
void Form1::init()
{
createConnection();
}
bool Form1::createConnection()
{
// create the default database connection
QSqlDatabase *defaultDB = QSqlDatabase::addDatabase( "QMYSQL3" );
if ( ! defaultDB ) {
qWarning( "Failed to connect to driver" );
return FALSE;
}
defaultDB->setDatabaseName( "mysql" );
defaultDB->setHostName("mscl");
defaultDB->setUserName( "root" );
defaultDB->setPassword( "39323286" );
// defaultDB->setHostName( "bookhost" );
if ( ! defaultDB->open() ) {
qWarning( "Failed to open database: " +
defaultDB->lastError().driverText() );
qWarning( defaultDB->lastError().databaseText() );
return FALSE;
}
return TRUE;
}
2. 編譯
[root@mscl mscl]# qmake -o Makefile dbcon.pro(my project name)
[root@mscl mscl]# make
3. 運行
[root@mscl mscl]# ./dbcon
出現錯誤說找不到can't load library 'libqt.so.3',記在在QT的源文件的安裝說明中有這樣的一句話,到Qt 的安裝目錄lib下看到這是一個符號鏈接,本來還想把它拷貝到/usr/lib中去解決,但是連接拷貝了也是沒有用的,在lib目錄下又沒有真正的庫(也許我找不到)。
解決辦法:在/root/目錄下創建一個名為(.login)文件(具體的請參照QT中的INSTALL),然後在這個文件中添加以下的變量:
setenv QTDIR /usr/local/qt
setenv PATH $QTDIR/bin:$PATH
setenv MANPATH $QTDIR/doc/man:$MANPATH
setenv LD_LIBRARY_PATH $QTDIR/lib:$LD_LIBRARY_PATH
添加完畢之後,一定要重新啟動計算機。我在重新啟動之後到/root目錄下看了一下原來的那個.login文件名已經變量了另外一個文件qt.log~,而且還是隱藏的,但是內容還是一樣的。
最後我重新運行這個可執行文件,沒有出現上面的問題了。但有新問題。
[root@mscl mscl]# ./dbcon
./dbcon: error while loading shared libraries: /usr/lib/libmysqlclient.so.15: cannot restore segment prot after reloc: Permission denied
這裡說明一下,由於之前我在運行的時候也出現了找不到庫文件libmysqlclient.so.15,我就到/usr/local/mysql/lib下找到這個文件,由於它不是個鏈接,於是我就直接把它拷貝到了/usr/lib目錄下,之後就沒有出現問題,但是現在又出現了一個新的問題。於是自己又想是不是訪問的權限不夠,右擊它,將它賦於讀寫的權限,但是沒有用還是老問題。
此時我注意到我的電腦的右上方出現了一個五角星,哈哈,按照以往相似的經驗,知道點擊它裡面肯定有解決方案,果不出我所料,原來SELinux阻止了程序加載libmysqlclient.so.15這個庫,因為需要代碼的重定位。在Allow Access標簽下有下面的一段話:
The following command will allow this access:
chcon -t textrel_shlib_t /usr/lib/libmysqlclient.so.15
照做吧:
[root@mscl mscl]# chcon -t textrel_shlib_t /usr/lib/libmysqlclient.so.15
[root@mscl mscl]# ./dbcon
^_^ ^_^ ^_^,終於正常地彈出了測試的窗口,至此有前QT的數據庫部分已經基本搞好了。
一些待解決的問題:有什麼辦法讓QT直接到/usr/local/mysql/lib下找libmysqlclient.so.15,這樣我就不用把它拷貝到/usr/lib目錄下了,就你libqt.so.3一樣?慢慢來吧
12.6號將上面的這個問題解決了,解決方法:
在/etc/ld.so.conf文件下我們可以看到它的內容為:
include ld.so.conf.d/*.conf
因此它將根據/etc/ld.so.conf.d目錄下的conf文件來查找動態庫(後綴為.so),所以我們可以在這裡建立一個conf文件,將我們的mysql動態鏈接庫路徑告訴系統,內容為:
/usr/local/mysql/lib
保存,然後運行ldconfig命令,因此此時系統要求動態庫要為一個鏈接符號,而我的/usr/local/mysql/lib下的libsqlclient.so.15並不是一個鏈接,此時SELinux阻止了應用程序加載這個動態庫,為了解決這個問題,我們可以運行下面這個命令:
chcon -t textrel_shlib_t /usr/local/mysql-5.0.45-linux-i686/lib/libmysqlclient.so.15
最後就OK了。
差點給忘記了,重啟啟動後,我原來安裝的Qt 3.3.6版本的Qt 被剛編譯的Qt 3.1替換了(指Applications菜單下的)。