詳解Linux下QT平臺Mysql數(shù)據(jù)庫開發(fā)環(huán)境配置
Linux下QT平臺Mysql數(shù)據(jù)庫開發(fā)環(huán)境配置是本文要介紹的內(nèi)容,主要是來了解QT數(shù)據(jù)庫在Linux開發(fā)環(huán)境下的配置,由于之前安裝RedHat的時候是自動選擇安裝了mysql數(shù)據(jù)庫以及QTdesigner,這一陣子用它的時候卻因?yàn)樗?strong>數(shù)據(jù)庫連接中遇到了很大的困難。
問題的出現(xiàn):
首先想測試一下數(shù)據(jù)庫的連接:選擇Projects-->databaseConnections,彈出一個EditDatabaseconnections的對話框,點(diǎn)擊Newconnection,在右邊出現(xiàn)可編輯的選項(xiàng),以下是配置:
- Name:default
 
Driver:點(diǎn)擊下拉框,沒有反應(yīng),于是我就按照QTAssistant上說的填上QMYSQL3
我的數(shù)據(jù)庫名先使用自帶的mysql
- DatabaseName:mysql
 - Username:root
 - Passworld:********(填上自己設(shè)置的密碼)
 - Hostname:mscl
 
然后就單擊connect按鈕,彈出
- can'tnot connect to the database,Pleaseen sure that the database server is running and that all connection in form ation is correct,
 - [Drivernotloaded】
 
郁悶了很久,究竟驅(qū)動是出在什么問題上,google了又百度了半天沒有什么頭緒,起始還以為是Mysql數(shù)據(jù)庫的問題,于是將原來用RPM安裝的Mysql數(shù)據(jù)庫刪了,重新到到www.mysql.com社區(qū)中下載了個二進(jìn)制的壓縮包mysql-5.0.45-linux-i686.tar.gz,其本上解壓出來就可以用了,啟動了服務(wù)器,重新按上面的設(shè)置進(jìn)行連接,但是還是出現(xiàn)原來一樣的問題,于是就想如果QT真的是支持MySQL驅(qū)動的話,應(yīng)當(dāng)在driver的下拉框中可以看得到的,于是將問題懷疑到Qt的驅(qū)動中。
于是我就找到QT3的安裝目錄(我的是在/usr/lib/qt3.3/plugins),但是我的卻沒有src/sqldrivers/mysql目錄,沒有mysql驅(qū)動的源代碼,編譯MySql驅(qū)動就無從談起,于是又去google看一下有沒有mysql在Qt中的驅(qū)動的源代碼,搜了一個晚上,邊條毛也沒有看到,很晚了就先睡了,究竟還有沒有其它的辦法?(周公尋夢)。。。
早上8點(diǎn)起床,繼續(xù)吧!
突然起了重新裝一個QT的想法,沒有辦法了只好試了一下,到IT68中下了個QT3.1版本的,12來M吧,然后就開始安裝:
1、選擇安裝路徑
- shell>cd/usr/local
 
2、解壓下載的安裝包(版本號不同,下面的編譯過程可能不同,以源目錄下的INSTALL文件為準(zhǔn))
- shell>tar-jxvfqt-x11-free-3.1.2.tar.bz2
 
3、設(shè)置環(huán)境變量(后來發(fā)現(xiàn)這一部分可以不用,因后在后面的.login中已經(jīng)設(shè)置好了)
在我的/etc/bashrc中添加如下幾行:
- QTDIR=/usr/local/qt:安裝的根目錄
 - PATH=$QTDIR/bin:$PATH:可執(zhí)行文件目錄
 - MANPATH=$QTDIR/doc/man:$MANPATH:man文檔目錄
 - LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH:庫文件的目錄
 
如果你的安裝路徑不是跟我的一樣,一定要設(shè)成相應(yīng)的。
4、配置configure腳本
我這里選用的都是默認(rèn)配置所以只輸入
- shell>./configure
 
如果你想改變安裝的路徑,或者是選擇安裝的庫文件及頭文件的位置,可以使用下面的選項(xiàng)
- ./configure-libdir/usr/local/lib-bindir/usr/local/bin-headerdir/usr/local/include/qt
 
這樣你的QT的庫文件,頭文件目錄就在相應(yīng)的目錄下了,但是記住你如果在這里進(jìn)行了設(shè)置也一定要在第三步中的環(huán)境變量中進(jìn)行相應(yīng)的發(fā)動。還有一個--prefix選項(xiàng),該選項(xiàng)設(shè)置qt安裝的目的目錄
5、編譯
- shell>make
 
這需要比較長的時間,我的機(jī)子配置是CPU速龍1.8G,1G內(nèi)存大概用了20來分鐘。
在編譯過程中出現(xiàn)了一個錯誤,忘了記下來了,大概就是說在fbm.c中noise3是靜態(tài)的,但是在fbm.h中的聲明是卻是非靜太的,在examples/demo/opengl下找到這兩個文件,將fbm.h中的floatnoise3(floatvec[])最前面加入static,保存。繼續(xù)鍵入make.
6、安裝
- shell>makeinstall
 - thisprocessalsotakeservalminutues,soyoushouldbepatient.
 
7、安裝完畢后,我找到bin目錄下,運(yùn)行designer,TMD果然行了,一個QT界面慢慢地展現(xiàn)在我的面前。
把QT安裝完成后,發(fā)現(xiàn)新安裝的QT比原來的系統(tǒng)自帶安裝的多了幾個目錄:config.tests,doc,examples,extensions,pics,qmake,src,tools,tutorial,還多了十來個文件,當(dāng)然最重要的是在plugins多了sqldrivers(這個目錄之前是空的,只有在編譯之后才有一個二進(jìn)制文件:libqsqlmysql.so),還有就是src目錄。
好了,終于有了qt下的mysql驅(qū)動源碼,接下來就按照QtAssistant中說的辦法編譯它:
- shell>cdusr/local/qt/plugins/src/sqldrivers/mysql
 - shell>qmake-oMakefile"INCLUDEPATH+=/usr/local/mysql/include""LIBS+=-L/usr/local/mysql/lib-lmysqlclient"mysql.pro
 
第2個命令就是生成Makefile文件,并將頭文件及庫文件的目錄添加到選項(xiàng)LIBS,INCLUDEPATH中。其中我的mysql是安裝在/usr/local/mysql下面就是編譯了,還是在原來的目錄下
- shell>make
 
到些驅(qū)動編譯完了,我到QTdesigner下看一下可不可以識別這個驅(qū)動。
1、啟動designer
- [root@msclbin]#/usr/local/qt/bin/designer
 
2、還是按照前面的設(shè)置databaseconnections
Name:connect_test(我給這次連接起了個名)
Driver:點(diǎn)擊下拉框,這時與前面不同的是,我可以看到QMYSQL3(^_^)
數(shù)據(jù)庫名還是使用mysql
- DatabaseName:mysql
 - Username:root
 - Passworld:********(填上自己設(shè)置的密碼)
 - Hostname:mscl
 
然后就單擊connect按鈕,可以在左邊的列表中看到我設(shè)置的這次連接的名字connect_test,花了兩天多終于把它給給連接上了。
下面是編寫代碼來測試數(shù)據(jù)庫,代碼的內(nèi)容基本是從QtAssistant拷貝的:
1、部分代碼
- voidForm1::init()
 - {
 - createConnection();
 - }
 - boolForm1::createConnection()
 - {
 - //createthedefaultdatabaseconnection
 - QSqlDatabase*defaultDB=QSqlDatabase::addDatabase("QMYSQL3");
 - if(!defaultDB){
 - qWarning("Failedtoconnecttodriver");
 - returnFALSE;
 - }
 - defaultDB->setDatabaseName("mysql");
 - defaultDB->setHostName("mscl");
 - defaultDB->setUserName("root");
 - defaultDB->setPassword("39323286");
 - //defaultDB->setHostName("bookhost");
 - if(!defaultDB->open()){
 - qWarning("Failedtoopendatabase:"+
 - defaultDB->lastError().driverText());
 - qWarning(defaultDB->lastError().databaseText());
 - returnFALSE;
 - }
 - returnTRUE;
 - }
 
2、編譯
- [root@msclmscl]#qmake-oMakefiledbcon.pro(myprojectname)
 - [root@msclmscl]#make
 
3、運(yùn)行
- [root@msclmscl]#./dbcon
 
出現(xiàn)錯誤說找不到can'tloadlibrary'libqt.so.3',記在在QT的源文件的安裝說明中有這樣的一句話,到Qt的安裝目錄lib下看到這是一個符號鏈接,本來還想把它拷貝到/usr/lib中去解決,但是連接拷貝了也是沒有用的,在lib目錄下又沒有真正的庫(也許我找不到)。
解決辦法:在/root/目錄下創(chuàng)建一個名為(.login)文件(具體的請參照QT中的INSTALL),然后在這個文件中添加以下的變量:
- setenvQTDIR/usr/local/qt
 - setenvPATH$QTDIR/bin:$PATH
 - setenvMANPATH$QTDIR/doc/man:$MANPATH
 - setenvLD_LIBRARY_PATH$QTDIR/lib:$LD_LIBRARY_PATH
 
添加完畢之后,一定要重新啟動計(jì)算機(jī)。我在重新啟動之后到/root目錄下看了一下原來的那個.login文件名已經(jīng)變量了另外一個文件qt.log~,而且還是隱藏的,但是內(nèi)容還是一樣的。
最后我重新運(yùn)行這個可執(zhí)行文件,沒有出現(xiàn)上面的問題了。但有新問題。
- [root@msclmscl]#./dbcon
 - ./dbcon:errorwhileloadingsharedlibraries:/usr/lib/libmysqlclient.so.15:cannotrestoresegmentprotafterreloc:Permissiondenied
 
這里說明一下,由于之前我在運(yùn)行的時候也出現(xiàn)了找不到庫文件libmysqlclient.so.15,我就到/usr/local/mysql/lib下找到這個文件,由于它不是個鏈接,于是我就直接把它拷貝到了/usr/lib目錄下,之后就沒有出現(xiàn)問題,但是現(xiàn)在又出現(xiàn)了一個新的問題。于是自己又想是不是訪問的權(quán)限不夠,右擊它,將它賦于讀寫的權(quán)限,但是沒有用還是老問題。
此時我注意到我的電腦的右上方出現(xiàn)了一個五角星,哈哈,按照以往相似的經(jīng)驗(yàn),知道點(diǎn)擊它里面肯定有解決方案,果不出我所料,原來SELinux阻止了程序加載libmysqlclient.so.15這個庫,因?yàn)樾枰a的重定位。在AllowAccess標(biāo)簽下有下面的一段話:
- Thefollowingcommandwillallowthisaccess:
 - chcon-ttextrel_shlib_t/usr/lib/libmysqlclient.so.15
 
照做吧:
- [root@msclmscl]#chcon-ttextrel_shlib_t/usr/lib/libmysqlclient.so.15
 - [root@msclmscl]#./dbcon
 
終于正常地彈出了測試的窗口,至此有前QT的數(shù)據(jù)庫部分已經(jīng)基本搞好了。
一些待解決的問題:有什么辦法讓QT直接到/usr/local/mysql/lib下找libmysqlclient.so.15,這樣我就不用把它拷貝到/usr/lib目錄下了,就你libqt.so.3一樣?慢慢來吧
12、6號將上面的這個問題解決了,解決方法:
在/etc/ld.so.conf文件下我們可以看到它的內(nèi)容為:
- includeld.so.conf.d/*.conf
 
因此它將根據(jù)/etc/ld.so.conf.d目錄下的conf文件來查找動態(tài)庫(后綴為.so),所以我們可以在這里建立一個conf文件,將我們的mysql動態(tài)鏈接庫路徑告訴系統(tǒng),內(nèi)容為:
- /usr/local/mysql/lib
 
保存,然后運(yùn)行l(wèi)dconfig命令,因此此時系統(tǒng)要求動態(tài)庫要為一個鏈接符號,而我的/usr/local/mysql/lib下的libsqlclient.so.15并不是一個鏈接,此時SELinux阻止了應(yīng)用程序加載這個動態(tài)庫,為了解決這個問題,我們可以運(yùn)行下面這個命令:
- chcon-ttextrel_shlib_t/usr/local/mysql-5.0.45-linux-i686/lib/libmysqlclient.so.15
 
最后就OK了。差點(diǎn)給忘記了,重啟啟動后,我原來安裝的Qt3.3.6版本的Qt被剛編譯的Qt3.1替換了(指Applications菜單下的)。
小結(jié):詳解Linux下QT平臺Mysql數(shù)據(jù)庫開發(fā)環(huán)境配置的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!















 
 
 
 
 
 
 