qt-odbc插件构建失败

qt-odbc插件构建失败,qt,plugins,odbc,Qt,Plugins,Odbc,我按照QT在Demos和Examples部分提供的SQL浏览器示例开发了一个应用程序。我的开发机器是WindowsXP(使用了VisualStudio编译器),应用程序在上面运行良好。它可以连接到外部数据库(MySQL),我还可以浏览表。我使用QODBC驱动程序进行连接。但是,当我在另一台没有QT的计算机上部署可执行文件(包含所有必需的.dll文件)时,它说我需要提供数据库驱动程序。我阅读了文档,意识到我需要为QODBC驱动程序构建一个插件。 首先,我看了一个示例插件(Echo插件示例)。然后,

我按照QT在Demos和Examples部分提供的SQL浏览器示例开发了一个应用程序。我的开发机器是WindowsXP(使用了VisualStudio编译器),应用程序在上面运行良好。它可以连接到外部数据库(MySQL),我还可以浏览表。我使用QODBC驱动程序进行连接。但是,当我在另一台没有QT的计算机上部署可执行文件(包含所有必需的.dll文件)时,它说我需要提供数据库驱动程序。我阅读了文档,意识到我需要为QODBC驱动程序构建一个插件。 首先,我看了一个示例插件(Echo插件示例)。然后,我按照书中的说明去做

上述命令生成了
qsqlodbc4.dll
。然而,我没有成功地为我的应用程序开发插件。以下是我的步骤和编译输出:

  • 在目录
    /odbcpluginest

  • 创建的子目录:
    /odbc、/sqlbrowser、/plugins

  • 在directroy
    /odbcpluginest/odbc/
    (i) 。复制了
    odbc.pro
    ,并适当修改了路径和文件名(例如,最初名为
    main.cpp
    的文件已重命名为
    maindbcp.cpp
    ,以避免与
    /sqlbrowser
    中名为
    main.cpp
    的文件混淆)。请参阅下面的脚本:

    (ii)。描述插件接口的文件
    odbcinterface.h
    作为头包含在
    odbc.pro
    中。但是,它实际上位于目录
    /sqlbrowser
    中。因此,上述脚本中包含了行
    INCLUDEPATH+=../sqlbrowser

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

    (四)。
    qsql\u odbc.pri
    的头文件(
    qsql\u odbc.h
    )和源文件(
    qsql\u odbc.cpp
    )也已复制

    在目录
    /odbcpluginest/sqlbrowser/
    (i) 。复制了
    sqlbrowser.pro
    和所有相关文件

    (ii)。创建描述插件接口(见下文)的头文件
    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
    
    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();
    }
    
    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
    
    #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
    
    #include "odbcinterface.h"
    private:
         bool loadPlugin();
        OdbcInterface *odbcInterface;
    Public:
     void TestCase1();
    
    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();
    }
    
    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'