2

我按照演示和示例部分中 QT 提供的 SQL Browser 示例开发了一个应用程序。我的开发机器是 Windows XP(使用了 Visual Studio 编译器),应用程序在它上面运行良好。它能够连接到外部数据库(MySQL),并且我能够浏览表。我使用 QODBC 驱动程序进行连接。但是,当我在另一台没有 QT 的计算机上部署可执行文件(包含所有必需的 .dll 文件)时,它说我需要提供数据库驱动程序。我阅读了文档并意识到我需要为 QODBC 驱动程序构建一个插件。首先,我查看了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。但是,我没有成功为我的应用程序开发插件。这是我的步骤和编译输出:

  1. 在目录下创建项目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
    
  2. 创建的子目录:/odbc, /sqlbrowser, /plugins

目录里面/odbcpluginTest /odbc/

(一世)。复制odbc.pro并适当修改了路径和文件名(例如,最初名为 as 的文件main.cpp已重命名为以避免与名为insidemainODBC.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

(二)。odbcinterface.h描述插件接口的文件包含在odbc.pro. 但是,它实际上是放在目录中的/sqlbrowser。因此,该行INCLUDEPATH += ../sqlbrowser包含在上述脚本中。

(iii)。此外,复制了所有相关的项目文件 ( qsql_odbc.pri, qsqldriverbase.pri, qpluginbase.pri, qt_targets.pri)。适当修改所有项目文件中的路径(这里可能有错误)。

(四)。的头文件 ( qsql_odbc.h) 和源qsql_odbc.cpp文件 ( )qsql_odbc.pri也已复制。

目录里面/odbcpluginTest /sqlbrowser/

(一世)。复制sqlbrowser.pro和所有相关文件。

(二)。创建了描述插件接口的头文件odbcinterface.h(见下文)并将其添加到sqlbrowser.pro.

#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'
4

0 回答 0