詳解Linux下QT平臺Mysql數據庫開發環境配置
Linux下QT平臺Mysql數據庫開發環境配置是本文要介紹的內容,主要是來了解QT數據庫在Linux開發環境下的配置,由于之前安裝RedHat的時候是自動選擇安裝了mysql數據庫以及QTdesigner,這一陣子用它的時候卻因為它在數據庫連接中遇到了很大的困難。
問題的出現:
首先想測試一下數據庫的連接:選擇Projects-->databaseConnections,彈出一個EditDatabaseconnections的對話框,點擊Newconnection,在右邊出現可編輯的選項,以下是配置:
- Name:default
Driver:點擊下拉框,沒有反應,于是我就按照QTAssistant上說的填上QMYSQL3
我的數據庫名先使用自帶的mysql
- DatabaseName:mysql
- Username:root
- Passworld:********(填上自己設置的密碼)
- 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】
郁悶了很久,究竟驅動是出在什么問題上,google了又百度了半天沒有什么頭緒,起始還以為是Mysql數據庫的問題,于是將原來用RPM安裝的Mysql數據庫刪了,重新到到www.mysql.com社區中下載了個二進制的壓縮包mysql-5.0.45-linux-i686.tar.gz,其本上解壓出來就可以用了,啟動了服務器,重新按上面的設置進行連接,但是還是出現原來一樣的問題,于是就想如果QT真的是支持MySQL驅動的話,應當在driver的下拉框中可以看得到的,于是將問題懷疑到Qt的驅動中。
于是我就找到QT3的安裝目錄(我的是在/usr/lib/qt3.3/plugins),但是我的卻沒有src/sqldrivers/mysql目錄,沒有mysql驅動的源代碼,編譯MySql驅動就無從談起,于是又去google看一下有沒有mysql在Qt中的驅動的源代碼,搜了一個晚上,邊條毛也沒有看到,很晚了就先睡了,究竟還有沒有其它的辦法?(周公尋夢)。。。
早上8點起床,繼續吧!
突然起了重新裝一個QT的想法,沒有辦法了只好試了一下,到IT68中下了個QT3.1版本的,12來M吧,然后就開始安裝:
1、選擇安裝路徑
- shell>cd/usr/local
2、解壓下載的安裝包(版本號不同,下面的編譯過程可能不同,以源目錄下的INSTALL文件為準)
- shell>tar-jxvfqt-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中的floatnoise3(floatvec[])最前面加入static,保存。繼續鍵入make.
6、安裝
- shell>makeinstall
- thisprocessalsotakeservalminutues,soyoushouldbepatient.
7、安裝完畢后,我找到bin目錄下,運行designer,TMD果然行了,一個QT界面慢慢地展現在我的面前。
把QT安裝完成后,發現新安裝的QT比原來的系統自帶安裝的多了幾個目錄:config.tests,doc,examples,extensions,pics,qmake,src,tools,tutorial,還多了十來個文件,當然最重要的是在plugins多了sqldrivers(這個目錄之前是空的,只有在編譯之后才有一個二進制文件:libqsqlmysql.so),還有就是src目錄。
好了,終于有了qt下的mysql驅動源碼,接下來就按照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文件,并將頭文件及庫文件的目錄添加到選項LIBS,INCLUDEPATH中。其中我的mysql是安裝在/usr/local/mysql下面就是編譯了,還是在原來的目錄下
- shell>make
到些驅動編譯完了,我到QTdesigner下看一下可不可以識別這個驅動。
1、啟動designer
- [root@msclbin]#/usr/local/qt/bin/designer
2、還是按照前面的設置databaseconnections
Name:connect_test(我給這次連接起了個名)
Driver:點擊下拉框,這時與前面不同的是,我可以看到QMYSQL3(^_^)
數據庫名還是使用mysql
- DatabaseName:mysql
- Username:root
- Passworld:********(填上自己設置的密碼)
- Hostname:mscl
然后就單擊connect按鈕,可以在左邊的列表中看到我設置的這次連接的名字connect_test,花了兩天多終于把它給給連接上了。
下面是編寫代碼來測試數據庫,代碼的內容基本是從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、運行
- [root@msclmscl]#./dbcon
出現錯誤說找不到can'tloadlibrary'libqt.so.3',記在在QT的源文件的安裝說明中有這樣的一句話,到Qt的安裝目錄lib下看到這是一個符號鏈接,本來還想把它拷貝到/usr/lib中去解決,但是連接拷貝了也是沒有用的,在lib目錄下又沒有真正的庫(也許我找不到)。
解決辦法:在/root/目錄下創建一個名為(.login)文件(具體的請參照QT中的INSTALL),然后在這個文件中添加以下的變量:
- setenvQTDIR/usr/local/qt
- setenvPATH$QTDIR/bin:$PATH
- setenvMANPATH$QTDIR/doc/man:$MANPATH
- setenvLD_LIBRARY_PATH$QTDIR/lib:$LD_LIBRARY_PATH
添加完畢之后,一定要重新啟動計算機。我在重新啟動之后到/root目錄下看了一下原來的那個.login文件名已經變量了另外一個文件qt.log~,而且還是隱藏的,但是內容還是一樣的。
最后我重新運行這個可執行文件,沒有出現上面的問題了。但有新問題。
- [root@msclmscl]#./dbcon
- ./dbcon:errorwhileloadingsharedlibraries:/usr/lib/libmysqlclient.so.15:cannotrestoresegmentprotafterreloc:Permissiondenied
這里說明一下,由于之前我在運行的時候也出現了找不到庫文件libmysqlclient.so.15,我就到/usr/local/mysql/lib下找到這個文件,由于它不是個鏈接,于是我就直接把它拷貝到了/usr/lib目錄下,之后就沒有出現問題,但是現在又出現了一個新的問題。于是自己又想是不是訪問的權限不夠,右擊它,將它賦于讀寫的權限,但是沒有用還是老問題。
此時我注意到我的電腦的右上方出現了一個五角星,哈哈,按照以往相似的經驗,知道點擊它里面肯定有解決方案,果不出我所料,原來SELinux阻止了程序加載libmysqlclient.so.15這個庫,因為需要代碼的重定位。在AllowAccess標簽下有下面的一段話:
- 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的數據庫部分已經基本搞好了。
一些待解決的問題:有什么辦法讓QT直接到/usr/local/mysql/lib下找libmysqlclient.so.15,這樣我就不用把它拷貝到/usr/lib目錄下了,就你libqt.so.3一樣?慢慢來吧
12、6號將上面的這個問題解決了,解決方法:
在/etc/ld.so.conf文件下我們可以看到它的內容為:
- includeld.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-ttextrel_shlib_t/usr/local/mysql-5.0.45-linux-i686/lib/libmysqlclient.so.15
最后就OK了。差點給忘記了,重啟啟動后,我原來安裝的Qt3.3.6版本的Qt被剛編譯的Qt3.1替換了(指Applications菜單下的)。
小結:詳解Linux下QT平臺Mysql數據庫開發環境配置的內容介紹完了,希望通過本文的學習能對你有所幫助!