Qt: un manque vtable signifie généralement que le premier non-inline fonction membre virtuelle n'a pas de définition

Il y a de nombreux fils sur tout ceci. Aucun ne semble correspondre à mon projet de loi. Je suis les liens suivante erreurs dans mon code:

Undefined symbols for architecture x86_64:
  "vtable for MSFSPlugin::MSFSPluginImpl", referenced from:
      MSFSPlugin::MSFSPluginImpl::MSFSPluginImpl(QObject*) in MSFSPlugin.o
      MSFSPlugin::MSFSPluginImpl::~MSFSPluginImpl() in MSFSPlugin.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Il doit avoir été quelque chose d'évident qu' - un manque vtable signifie généralement que le premier non-inline fonction membre virtuelle n'a pas de définition. Cependant, je ne vois pas ce que je suis absent:

J'ai cette classe declation dans MSFSPlugin.h:

class MSFSPlugin
    :
    public QObject,
    public IMediaSource
{
    Q_OBJECT
    Q_INTERFACES(IMediaSource)
    ...
protected:
    class MSFSPluginImpl;
    MSFSPluginImpl* mImpl;

}

Puis dans MSFSPlugin.cpp, j'ai le texte suivant:

class MSFSPlugin::MSFSPluginImpl : public QThread
{
    Q_OBJECT
    public:
        MSFSPluginImpl(QObject *parent = 0);
        virtual ~MSFSPluginImpl();

        QString     getSourceDirectory() const;
        void        setSourceDirectory(QString sourceDirectory);

    signals:
        void        loadDirectoryFinished(bool success);

    protected:
        QString     mSourceDirectory;
};

Suivie par les définitions:

MSFSPlugin::MSFSPluginImpl::MSFSPluginImpl(QObject *parent) : QThread(parent)
{
}

MSFSPlugin::MSFSPluginImpl::~MSFSPluginImpl()
{
}

QString MSFSPlugin::MSFSPluginImpl::getSourceDirectory() const
{
    return mSourceDirectory;
}

void MSFSPlugin::MSFSPluginImpl::setSourceDirectory(QString sourceDirectory)
{
    mSourceDirectory = sourceDirectory;
}

...

En bref, je ne pense pas que je suis absent toute non en ligne virtuel membre de la définition de la fonction. Je suis à l'aide d':

Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix

Informations Supplémentaires:

Dans mon moc_MSFSPlugin.cpp je ne vois pas l'générée automatiquement Q_OBJECT connexes de code pour la classe MSFSPlugin::MSFSPluginImpl qui indirectement (par l'intermédiaire de QThread) découle de QObject. Plus précisément, je ne vois pas le code généré pour le signal, a déclaré dans la classe (loadDirectoryFinished). Serait-ce le problème?

EDIT 1:
L'erreur disparaît si je commentaire Q_OBJECT de la declation de MSFSPlugin::MSFSPluginImpl, mais alors je perds le signal de la fonctionnalité.

EDIT 2:
Je vois moc fonctionne sur les fichiers d'en-tête uniquement. Cela pourrait-il être lié au fait que ma classe dérivée de QObject est déclaré & définie dans un .fichier cpp?

Vous avez à peu près répondu à votre propre question. L'erreur de compilation est lié au fait que les moc n'est pas de générer du code pour MSFSPluginImpl (parce que c'est dans un .fichier cpp). La création d'un en-tête de pour les il devrait résoudre votre problème.
Lol. Je suppose que j'ai fait. Merci pour la confirmation.
double possible de la Compilation de QObject classe dérivée sur la ligne de commande sur Linux
Je pense que c'est un peu injuste pour marquer cela comme un double d'un post qui est intitulé "Compilation de QObject, dérivées de la classe sur la ligne de commande sur Linux"
il y a beaucoup de questions autour de vtables que nous avons besoin de marquer les doublons pour éviter le bruit. Si le titre est trompeur pour vous, n'hésitez pas à modifier, mais aussi loin que je peux dire, la cause de celles-ci est la même quelques-unes des raisons qui peuvent être énumérés dans un canoniques.

OriginalL'auteur Code Poet | 2014-05-11