如何在 静态编译的QT 5.5.1 中 使用数据库插件连接 ODBC(调用静态插件)

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在 静态编译的QT 5.5.1 中 使用数据库插件连接 ODBC(调用静态插件)相关的知识,希望对你有一定的参考价值。

前段时间由于工作的关系,需要编写一个将数据插入到 Sql server 2012 的桌面软件。

由于之前使用的是MFC,偶然间接触到了Qt后,被它的简洁惊艳到了,于是便毅然而然的转投到了Qt的怀抱,哈哈……

 

废话不多说,我使用的是最新的Qt 5.5.1版本(Qt 5.5.1 for Windows 32-bit MinGW), 在一路查看帮助文档后,

终于是把程序编译出来,正常运行了。正当我满心欢喜的交付出去的时候,遇到问题了,程序在对方的电脑上运行时,

提示缺少动态库!而且不同电脑缺少的库还不一定相同!费劲心思找好缺少的库后,原本满满的成就感就降低了许多……

在网上寻求的帮助过程中,我想到了静态编译的方式……

 

 

How to build a static Qt version for Windows with gcc

 

 

说做就做,按着官方网站的说明,无脑照搬步骤编译出来了静态

版本,但是在使用的时候出问题了:

运行的时候提示:

"Driver not loaded Driver not loaded"
Available drivers:
     "QSQLITE"

擦,原来默认没把odbc的驱动编译进去,好吧,按照Qt帮助文档的说明编译出了  libqsqlodbcd.a 、libqsqlodbc.a
这两个文件,然后想当然地把这两个文件放到 %QT/plugins的sqldrivers文件夹下,你猜怎么着,根本就没有这个文件夹!

好吧,既然没有,那我就给你建立一个,但还是没什么鬼用……

终于,皇天不负有心人,我了解到,我现在使用ODBC驱动的方式 叫做“调用静态插件”, Qt正好有那么篇介绍的文章:

How to Create Qt Plugins


按照上面的说明,在.pro 文件中加入如下语句:

 

QTPLUGIN+= qsqlodbc

 

并在.cpp文件中添加语句:

 

#include<QtPlugin>

Q_IMPORT_PLUGIN(QODBCDriverPlugin)

这里要说一下,插件的名字,也就是这里的“QODBCDriverPlugin”,去哪里找呢?这得到我们编译这个驱动的.pro文件中找,这里是 odbc.pro,
(目录: %Qt\src\qt-everywhere-opensource-src-5.5.1\qtbase\src\plugins\sqldrivers\odbc)。

另外,还要把和 .a库一起编译出来的两个 .prl 文件放到 %Qt\lib 目录下,并编辑这两个文件,把里面 QMAKE_PRL_LIBS 中的静态库路径修改成你编译出来的静态库的路径。

做完以上的,就执行一次 clean ,qmake 重新编译就OK了,这时候是不是能连接上了啊,哈哈……(这过程的心酸,终于换来了收获的喜悦……啊啊啊)


下面附上测试的 Demo 代码

staticTest.pro
[cpp] view plain copy
 
  1. #-------------------------------------------------  
  2. #  
  3. # Project created by QtCreator 2016-01-16T20:55:32  
  4. #  
  5. #-------------------------------------------------  
  6.   
  7. QT       += core gui sql  
  8.   
  9.   
  10. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets  
  11. QTPLUGIN += qsqlodbc  
  12. TEMPLATE = app  
  13.   
  14.   
  15.   
  16. SOURCES += main.cpp\  
  17.         mainwindow.cpp  
  18.   
  19. HEADERS  += mainwindow.h  
  20.   
  21. FORMS    += mainwindow.ui  


---------------------------------------------------
mainwindow.cpp

[cpp] view plain copy
 
  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3. #include <QDebug>  
  4. #include <QtSql/QSqlDatabase>  
  5. #include <QtSql/QSqlError>  
  6. #include <QtSql/QSqlDriver>  
  7. #include <QtPlugin>  
  8. Q_IMPORT_PLUGIN(QODBCDriverPlugin)  
  9.   
  10.   
  11. MainWindow::MainWindow(QWidget *parent) :  
  12.     QMainWindow(parent),  
  13.     ui(new Ui::MainWindow)  
  14. {  
  15.     ui->setupUi(this);  
  16. }  
  17.   
  18. MainWindow::~MainWindow()  
  19. {  
  20.     delete ui;  
  21. }  
  22.   
  23. void MainWindow::on_pushButton_clicked()  
  24. {  
  25.     qDebug()<<"haha";  
  26.     QSqlDatabase qDB = QSqlDatabase::addDatabase("QODBC");  
  27.     qDB.setHostName("127.0.0.1");  
  28.     qDB.setDatabaseName("Driver={sql server};server=127.0.0.1;database=MyTempDB;");  
  29.     qDB.setUserName("sa");  
  30.     qDB.setPassword("123456");  
  31.     bool IsOpen = qDB.open();  
  32.     if(IsOpen)  
  33.     {  
  34.        qDebug()<<"connect to Database Success.";  
  35.     }  
  36.     else  
  37.     {  
  38.         qDebug()<<"Connect failed!";  
  39.         QSqlError qerror = qDB.lastError();  
  40.         qDebug()<<qerror.text();  
  41.     }  
  42.   
  43.     qDebug() << "Available drivers:";  
  44.   
  45.     QStringList drivers = QSqlDatabase::drivers();  
  46.   
  47.     foreach(QString driver, drivers)  
  48.     qDebug() << "\t" << driver;  
  49.   
  50. }  


*/

 

*--------------------------------------

** Edit by : 小菜

** Time:     2016-01-19

*--------------------------------------

*/

http://blog.csdn.net/humadivinity/article/details/50545100

以上是关于如何在 静态编译的QT 5.5.1 中 使用数据库插件连接 ODBC(调用静态插件)的主要内容,如果未能解决你的问题,请参考以下文章

如何在VS2015中集成QT5.5

如何使用 Qt 5.5.1 在调试器中查看 QString 值

QT中如何使用MYSQL 以及静态编译QT中如何加上MYSQL

如何在VS2015中使用PostgreSQL插件静态编译Qt 5.8

QT静态库静态编译

Qt 如何编译成可执行程序,像VC的静态编译,可以在脱离QT的环境中运行