把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的数据库部分已经基本搞好了。