Linux下Qt链接MySql折腾

2014年12月29日 由 Creater 留言 »

最近的项目想在Linux下来做,但是数据库这块有一些问题,浪费了好几个小时,记录在此备忘一下。

    1.QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7
    提示驱动没有加载,应该是链接库出问题,进入Qt的数据库插件目录

    cd /usr/local/Qt5.2.1/5.2.1/gcc/plugins/sqldrivers/

    查看当前Qt处理mysql的动态链接库依赖的动态连接库
    [sjell]ldd libqsqlmysql.so [/shell]
    会发现如下的信息,你会发现有一行结尾是 “not found”

           linux-vdso.so.1 =>  (0x00007fff457d9000)
            libmysqlclient_r.so.16 => not found
    	linux-gate.so.1 =>  (0xb771f000)
    	libQt5Sql.so.5 => /usr/local/Qt5.2.1/5.2.1/gcc/lib/libQt5Sql.so.5 (0xb76cc000)
    	libQt5Core.so.5 => /usr/local/Qt5.2.1/5.2.1/gcc/lib/libQt5Core.so.5 (0xb6ebe000)
    	libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb6dd5000)
    	libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6c26000)
    	libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb6c0c000)
    	libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb6c06000)
    	libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb6bea000)
    	libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6ba4000)
    	libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6b87000)
    	libicui18n.so.51 => /usr/local/Qt5.2.1/5.2.1/gcc/lib/libicui18n.so.51 (0xb6965000)
    	libicuuc.so.51 => /usr/local/Qt5.2.1/5.2.1/gcc/lib/libicuuc.so.51 (0xb67eb000)
    	libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0xb67e8000)
    	librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb67df000)
    	libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb66d3000)
    	/lib/ld-linux.so.2 (0xb7720000)
    	libicudata.so.51 => /usr/local/Qt5.2.1/5.2.1/gcc/lib/libicudata.so.51 (0xb518a000)
    	libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb514b000)
    

    找到qt中数据库的源代码目录,我的在
    /usr/local/share/qt-everywhere-opensource-src-5.2.1/qtbase/src/plugins/sqldrivers/mysql

    qmake && make 

    会生成几个文件,拷贝到/usr/local/Qt5.2.1/5.2.1/gcc/plugins/sqldrivers/后再ldd发现已经没有上面的问题。

  • 2.数据库不能连接
  • 我采用如下的代码来测试数据库联通性,一方面可以测试联通与否,还可以打印出错原因。

    #include <QCoreApplication>
    #include <QtSql>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
        db.setHostName("localhost");
        db.setDatabaseName("mysql");
        db.setUserName("root");
        db.setPassword("1234");
    	qDebug() << "Available drivers:";
    	QStringList drivers = QSqlDatabase::drivers();
    	 foreach(QString driver, drivers) qDebug() << "\t" << driver;
        bool ok = db.open();
        qDebug() << ok<<endl;
    	qDebug()<<db.lastError()<<endl;
        db.close();
        return a.exec();
    }
    

    但是出现以下原因:

    QSqlError(2002, "QMYSQL: Unable to connect", "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'(2)") 

    使用

    ps -aux | grep mysql

    找到mysql然后kill掉。我是采用这种方法解决Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’错误。

  • 3.环境变量设置
  • 需要正确的设置环境变量,我的环境变量如下:
    profile.tar

广告位

发表评论

你必须 登陆 方可发表评论.