我在演示和示例部分中根据QT提供的SQL浏览器示例开发了一个应用程序。我的开发机器是Windows XP(使用了visual studio编译器),应用程序运行良好。它能够连接到外部数据库(MySQL),我可以浏览表格。我使用QODBC驱动程序进行连接。但是,当我在没有QT的另一台计算机上部署可执行文件(包含所有必需的.dll文件)时,它说我需要提供数据库驱动程序。我阅读了文档并意识到我需要为QODBC驱动程序构建一个PlugIn。 首先,我查看了http://doc.qt.digia.com/4.6/tools-echoplugin.html给出的示例插件(Echo插件示例)。然后我按照http://doc.qt.digia.com/4.6/sql-driver.html#qodbc中的说明进行操作。
cd %QTDIR%\src\plugins\sqldrivers\odbc
qmake odbc.pro
nmake
以上命令构建qsqlodbc4.dll
。但是,我没有成功为我的应用程序开发插件。以下是我的步骤和编译输出:
在目录odbcplugin.pro
下创建项目/odbcpluginTest
(请参阅下面的脚本)
TEMPLATE = subdirs SUBDIRS = sqlbrowser \ odbc CONFIG += release # install target.path = $$PWD sources.path = $$PWD sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS INSTALLS += target sources
创建的子目录:/odbc, /sqlbrowser, /plugins
/odbcpluginTest /odbc/
(i)中。复制odbc.pro
并适当修改路径和文件名(例如,最初命名为main.cpp
的文件已重命名为mainODBC.cpp
,以避免与名为main.cpp
的文件混淆/sqlbrowser
)。请参阅以下脚本:
TEMPLATE = lib INCLUDEPATH += ../sqlbrowser SOURCES = mainODBC.cpp TARGET = qsqlodbc DESTDIR = ../plugins CONFIG += release include(qsql_odbc.pri) include(qsqldriverbase.pri) sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS INSTALLS += target sources
(ii)中。描述插件接口的文件odbcinterface.h
作为标题包含在odbc.pro
中。但是,它实际上放在目录/sqlbrowser
中。因此,行INCLUDEPATH += ../sqlbrowser
包含在上面的脚本中。
(III)。此外,复制了所有相关的项目文件(qsql_odbc.pri, qsqldriverbase.pri, qpluginbase.pri, qt_targets.pri
)。适当修改了所有项目文件中的路径(这里可能存在错误)。
(IV)。 qsql_odbc.h
的标题(qsql_odbc.cpp
)和来源(qsql_odbc.pri
)文件也已被复制。
/odbcpluginTest /sqlbrowser/
(i)中。已复制sqlbrowser.pro
和所有相关文件。
(ii)中。创建了描述插件接口的头文件odbcinterface.h
(见下文),并将其添加到sqlbrowser.pro
中的HEADERS中。
#ifndef ODBCINTERFACE_H
#define ODBCINTERFACE_H
#include <QString>
#include <QtSql/qsqldriver.h>
class OdbcInterface
{
public:
virtual ~OdbcInterface() {}
virtual QSqlDriver* create(const QString &) = 0;
virtual QStringList keys() const = 0;
};
QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(OdbcInterface,
"developed similar to com.trolltech.Plugin.EchoInterface/1.0");
QT_END_NAMESPACE
#endif // ODBCINTERFACE_H
III。此外,通过添加行
修改了browser.h
文件
#include "odbcinterface.h"
private:
bool loadPlugin();
OdbcInterface *odbcInterface;
Public:
void TestCase1();
IV。此外,通过添加函数定义来修改browser.cpp
文件:
bool Browser::loadPlugin()
{
QDir pluginsDir(qApp->applicationDirPath());
#if defined(Q_OS_WIN)
pluginsDir.cdUp();
pluginsDir.cdUp();
#endif
pluginsDir.cd("plugins");
foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
QObject *pluginI = pluginLoader.instance();
if (pluginI) {
odbcInterface = qobject_cast<OdbcInterface *>(pluginI);
if (odbcInterface)
return true;
}
}
return false;
}
void Browser::TestCase1()
{
loadPlugin();
QStringList list;
list = odbcInterface->keys();
QMessageBox msgBox;
if(list.length() >0)
{
msgBox.setText("Test1 success");
}
else
{
msgBox.setText("Test1 failure");
}
msgBox.exec();
}
在browser.cpp
文件中,通过追加对Browser::Browser(QWidget *parent)
void Browser::TestCase1()
15:09:18: Running build steps for project odbcplugin...
15:09:18: Configuration unchanged, skipping qmake step.
15:09:18: Starting: "C:\QtSDK\QtCreator\bin\jom.exe"
cd sqlbrowser\ && C:\QtSDK\QtCreator\bin\jom.exe -nologo -j 2 -f Makefile
C:\QtSDK\QtCreator\bin\jom.exe -nologo -j 2 -f Makefile.Debug
cd odbc\ && C:\QtSDK\QtCreator\bin\jom.exe -nologo -j 2 -f Makefile
C:\QtSDK\QtCreator\bin\jom.exe -nologo -j 2 -f Makefile.Release
link /LIBPATH:"c:\QtSDK\Desktop\Qt\4.8.1\msvc2010\lib" /NOLOGO /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO /DLL /MANIFEST /MANIFESTFILE:"release\qsqlodbc.intermediate.manifest" /VERSION:4.81 /OUT:..\plugins\qsqlodbc4.dll @C:\DOCUME~1\SHAINE~1\LOCALS~1\Temp\qsqlodbc4.dll.5076.0.jom
Creating library ..\plugins\qsqlodbc4.lib and object ..\plugins\qsqlodbc4.exp
mainODBC.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall QODBCDriverPlugin::metaObject(void)const " (?metaObject@QODBCDriverPlugin@@UBEPBUQMetaObject@@XZ)
mainODBC.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall QODBCDriverPlugin::qt_metacast(char const *)" (?qt_metacast@QODBCDriverPlugin@@UAEPAXPBD@Z)
mainODBC.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall QODBCDriverPlugin::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@QODBCDriverPlugin@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
..\plugins\qsqlodbc4.dll : fatal error LNK1120: 3 unresolved externals
jom 1.0.6 - empower your cores
command failed with exit code 1120
command failed with exit code 2
command failed with exit code 2
15:09:19: The process "C:\QtSDK\QtCreator\bin\jom.exe" exited with code 2.
Error while building project odbcplugin (target: Desktop)
When executing build step 'Make'