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