如何在 静态编译的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
- #-------------------------------------------------
- #
- # Project created by QtCreator 2016-01-16T20:55:32
- #
- #-------------------------------------------------
- QT += core gui sql
- greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
- QTPLUGIN += qsqlodbc
- TEMPLATE = app
- SOURCES += main.cpp\
- mainwindow.cpp
- HEADERS += mainwindow.h
- FORMS += mainwindow.ui
---------------------------------------------------
mainwindow.cpp
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- #include <QDebug>
- #include <QtSql/QSqlDatabase>
- #include <QtSql/QSqlError>
- #include <QtSql/QSqlDriver>
- #include <QtPlugin>
- Q_IMPORT_PLUGIN(QODBCDriverPlugin)
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- void MainWindow::on_pushButton_clicked()
- {
- qDebug()<<"haha";
- QSqlDatabase qDB = QSqlDatabase::addDatabase("QODBC");
- qDB.setHostName("127.0.0.1");
- qDB.setDatabaseName("Driver={sql server};server=127.0.0.1;database=MyTempDB;");
- qDB.setUserName("sa");
- qDB.setPassword("123456");
- bool IsOpen = qDB.open();
- if(IsOpen)
- {
- qDebug()<<"connect to Database Success.";
- }
- else
- {
- qDebug()<<"Connect failed!";
- QSqlError qerror = qDB.lastError();
- qDebug()<<qerror.text();
- }
- qDebug() << "Available drivers:";
- QStringList drivers = QSqlDatabase::drivers();
- foreach(QString driver, drivers)
- qDebug() << "\t" << driver;
- }
*/
*--------------------------------------
** Edit by : 小菜
** Time: 2016-01-19
*--------------------------------------
*/
http://blog.csdn.net/humadivinity/article/details/50545100
如何在 静态编译的QT 5.5.1 中 使用数据库插件连接 ODBC(调用静态插件)的更多相关文章
- VS2010使用静态编译的qt库(Qt 5)
Qt 5引入了一种新的编写方式. Qt开发界面很方便,但发布程序就不那么方便了,你的把引用到的dll一起发布才行,要是能静态编译就好了,发布的时候只有一个exe多方便. 虽然以前为了方便,直接安装的q ...
- VS2010使用静态编译的qt库
Qt开发界面很方便,但发布程序就不那么方便了,你的把引用到的dll一起发布才行,要是能静态编译就好了,发布的时候只有一个exe多方便. 虽然以前为了方便,直接安装的qt-windows-opensou ...
- Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)
When compiling Qt you can choose one of these options based on the configure command line: no OpenSS ...
- VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序
下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...
- 记录下 QT Linux 静态编译遇到的坑
Qt下静态编译Qt,根据我的经验,如果按照Windows下那种直接拿官方sdk安装之后的文件来编译是行不通的,需要直接下载Qt的source包,目前诺基亚的源码叫做qt-everywhere-open ...
- Linux下快速静态编译Qt以及Qt动态/静态版本共存
Qt下静态编译Qt,根据我的经验,如果按照Windows下那种直接拿官方sdk安装之后的文件来编译是行不通的,需要直接下载Qt的source包,目前诺基亚的源码叫做qt-everywhere-open ...
- Linux/Ubuntu下 静态编译Qt程序
一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的.会提示缺少……库文件之类的错误.这就是动态编译的结果. 但是如果我们想编译一个程序 ...
- Linux下静态编译Qt程序
一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的.会提示缺少……库文件之类的错误.这就是动态编译的结果. 但是如果我们想编译一个程序 ...
- 亲测VS2010纯静态编译QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序(图文并茂,非常详细)
下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip,不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0- ...
随机推荐
- java整体集合框架
1.关于集合的两道面试题 先来看几道题目: 1.创建一个不可变的的集合: public static void main(String[] args) { Set<String> set ...
- JavaScript判断IE各版本完美解决方案
解决方案 IE知道自身毛病很多,于是提供的一套官方的HTML hack方式: <!--[if IE]> // 全部IE版本可见 <![endif]--> <!--[if ...
- 关于使用HttpSessionBindingListener获取在线用户数,同一用户登陆一次
原创地址:http://blog.csdn.net/jiaoxueli/article/details/2226134 考虑到项目中统计在线用户数量和同一用户只能登陆一次的需求,查询联系 HttpSe ...
- 有了bootstrap,为什么还要做amaze ui
1.Bootstrap介绍Bootstrap,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加 ...
- JSC学习笔记:JavaScriptCore 初识
JSContext/JSValue JSContext是运行JavaScript的上下文环境,是一个全局环境实例:类似于浏览器端的window对象,表示浏览器的窗口:在浏览器中,所有JavaScrip ...
- Landsat8数据不同波段组合的用途
2013年2月11日发射的Landsat系列最新卫星Landsat8,携带有OLI陆地成像仪和TIRS热红外传感器,Landsat8的OLI陆地成像仪包括9个波段,OLI包括了ETM+传感器所有的波段 ...
- [置顶] 实习总结3-job hunting(西安工作)
开始整理关于西安top level的IT企业的工作从去年开始实习就慢慢展开了,到了北京之后一直关注的比较密切,因此前前后后也整理了很多.本来不打算那么急着写这一篇的,但是在因为在公司呆着,对于西安的一 ...
- docker 基于现有镜像修改后保存,上传私有仓库
docker:/root# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f3cb864be528 192.168.3 ...
- 编写最简单的 iPhone 界面切换应用
编写最简单的 iPhone 界面切换应用 以下是在iOS中最简单的界面切换示例.使用了多个Controller,并演示Controller之间在切换界面时的代码处理. 实现的应用界面: 首先,创建 ...
- fuel Explain
http://docs.mirantis.com/openstack/fuel/fuel-5.1/ https://software.mirantis.com/quick-start/ https:/ ...