简体   繁体   中英

Undefined references during build of plugin in Qt Creator

I'm trying to create plugin for Qt Creator, so I simply selected new file or project/Libraries/QtCreator plugin. I've specified the sources for Qt Creator as well as build of Qt Creator. When I've tried to build it I'm getting the following three errors:

*C:\...\mypluginplugin.cpp:20: error:  
 undefined reference to `vtable for MyPlugin::Internal::MyPluginPlugin'*  //this is constructor
*C:\...\mypluginplugin.cpp:25: error:  
undefined reference to `vtable for MyPlugin::Internal::MyPluginPlugin'* //this is destructor  
    C:\...\mypluginplugin.hpp:13: error:  
   undefined reference to `MyPlugin::Internal::MyPluginPlugin::staticMetaObject' //when I double click   
on this error it moves me to my .hpp file to the Q_OBJECT macro:  

This is my code:

namespace MyPlugin {
namespace Internal {

class MyPluginPlugin : public ExtensionSystem::IPlugin
{
    Q_OBJECT// the last, third error moves me here

public:
    MyPluginPlugin();
    ~MyPluginPlugin();

    bool initialize(const QStringList &arguments, QString *errorString);
    void extensionsInitialized();
    ShutdownFlag aboutToShutdown();

private slots:
    void triggerAction();
};

} // namespace Internal
} // namespace MyPlugin

Any idea how to solve this problem?
//EDIT

#include "mypluginplugin.hpp"
#include "mypluginconstants.hpp"

#include <coreplugin/icore.h>
#include <coreplugin/icontext.h>
#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/actionmanager/command.h>
#include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/coreconstants.h>

#include <QAction>
#include <QMessageBox>
#include <QMainWindow>
#include <QMenu>

#include <QtPlugin>

using namespace MyPlugin::Internal;

MyPluginPlugin::MyPluginPlugin()
{
    // Create your members
}

MyPluginPlugin::~MyPluginPlugin()
{
    // Unregister objects from the plugin manager's object pool
    // Delete members
}

bool MyPluginPlugin::initialize(const QStringList &arguments, QString *errorString)
{
    // Register objects in the plugin manager's object pool
    // Load settings
    // Add actions to menus
    // Connect to other plugins' signals
    // In the initialize method, a plugin can be sure that the plugins it
    // depends on have initialized their members.

    Q_UNUSED(arguments)
    Q_UNUSED(errorString)

    QAction *action = new QAction(tr("MyPlugin action"), this);
    Core::Command *cmd = Core::ActionManager::registerAction(action, Constants::ACTION_ID,
                                                             Core::Context(Core::Constants::C_GLOBAL));
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Alt+Meta+A")));
    connect(action, SIGNAL(triggered()), this, SLOT(triggerAction()));

    Core::ActionContainer *menu = Core::ActionManager::createMenu(Constants::MENU_ID);
    menu->menu()->setTitle(tr("MyPlugin"));
    menu->addAction(cmd);
    Core::ActionManager::actionContainer(Core::Constants::M_TOOLS)->addMenu(menu);

    return true;
}

void MyPluginPlugin::extensionsInitialized()
{
    // Retrieve objects from the plugin manager's object pool
    // In the extensionsInitialized method, a plugin can be sure that all
    // plugins that depend on it are completely initialized.
}

ExtensionSystem::IPlugin::ShutdownFlag MyPluginPlugin::aboutToShutdown()
{
    // Save settings
    // Disconnect from signals that are not needed during shutdown
    // Hide UI (if you add UI that is not in the main window directly)
    return SynchronousShutdown;
}

void MyPluginPlugin::triggerAction()
{
    QMessageBox::information(Core::ICore::mainWindow(),
                             tr("Action triggered"),
                             tr("This is an action from MyPlugin."));
}

Q_EXPORT_PLUGIN2(MyPlugin, MyPluginPlugin)

I figured out what happened. Ok, here is the solution for others - qtcreator simply didn't attach .hpp files to the project, yet there were created. After adding those .hpp files via add existing files, it builds fine now.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM