Макрос Q_OBJECT выдает «Нарушение прав чтения» ** priv ** (...) при инициализации - PullRequest
0 голосов
/ 07 февраля 2020

Я унаследовал проект, построенный с использованием:

  • Qt 5.7.1
  • Visual C ++ 2017
  • . Net Framework 4.8.03761

Я далеко не эксперт, когда дело доходит до Qt, и мой гугл-фу подвел меня к этому.

Ситуация:

У меня есть проект, который действует как плагин Qt. В моей кодовой базе есть два других примера того, как эти проекты должны быть настроены, при инициализации шахты возникает ошибка во время выполнения, которая не происходит с другими примерами, где код почти такой же.

Мой код:

В проекте Enveloppe3DPlugin у меня есть класс с именем Enveloppe3DPlugin. Вот где у меня ошибка выполнения.

Enveloppe3DPlugin.h

#pragma once

#include <QObject>
#include "DllPlugin\BasePluginInterface.h"
class Enveloppe3DPlugin : public QLIO::BasePluginInterface
{
    Q_OBJECT
        Q_PLUGIN_METADATA(IID "org.LIO.MainWindow.BasePluginInterface" FILE "Enveloppe3DPlugin.json")
        Q_INTERFACES(QLIO::BasePluginInterface)

public:
    Enveloppe3DPlugin();
    virtual ~Enveloppe3DPlugin() {}
    virtual void initialize(LIO::Element* io_RootData, QLIO::Presenter* io_RootPresenter);
};

Enveloppe3DPlugin. cpp

#include "Enveloppe3DPlugin.h"

const QString PLUGIN_NAME = Enveloppe3DPlugin::tr("Enveloppe3DPlugin");

Enveloppe3DPlugin::Enveloppe3DPlugin()
    : BasePluginInterface(PLUGIN_NAME, QLIO::Enveloppe3DPluginPriority) { }

void Enveloppe3DPlugin::initialize(LIO::Element * io_RootData, QLIO::Presenter * io_RootPresenter) { }

moc_Enveloppe3DPlugin. cpp

/****************************************************************************
** Meta object code from reading C++ file 'Enveloppe3DPlugin.h'
**
** Created by: The Qt Meta Object Compiler version 67 (Qt 5.7.1)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/

#include "../../Enveloppe3DPlugin.h"
#include <QtCore/qbytearray.h>
#include <QtCore/qmetatype.h>
#include <QtCore/qplugin.h>
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'Enveloppe3DPlugin.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 67
#error "This file was generated using the moc from 5.7.1. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif

QT_BEGIN_MOC_NAMESPACE
struct qt_meta_stringdata_Enveloppe3DPlugin_t {
    QByteArrayData data[1];
    char stringdata0[18];
};
#define QT_MOC_LITERAL(idx, ofs, len) \
    Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
    qptrdiff(offsetof(qt_meta_stringdata_Enveloppe3DPlugin_t, stringdata0) + ofs \
        - idx * sizeof(QByteArrayData)) \
    )
static const qt_meta_stringdata_Enveloppe3DPlugin_t qt_meta_stringdata_Enveloppe3DPlugin = {
    {
QT_MOC_LITERAL(0, 0, 17) // "Enveloppe3DPlugin"

    },
    "Enveloppe3DPlugin"
};
#undef QT_MOC_LITERAL

static const uint qt_meta_data_Enveloppe3DPlugin[] = {

 // content:
       7,       // revision
       0,       // classname
       0,    0, // classinfo
       0,    0, // methods
       0,    0, // properties
       0,    0, // enums/sets
       0,    0, // constructors
       0,       // flags
       0,       // signalCount

       0        // eod
};

void Enveloppe3DPlugin::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
    Q_UNUSED(_o);
    Q_UNUSED(_id);
    Q_UNUSED(_c);
    Q_UNUSED(_a);
}

const QMetaObject Enveloppe3DPlugin::staticMetaObject = {
    { &QLIO::BasePluginInterface::staticMetaObject, qt_meta_stringdata_Enveloppe3DPlugin.data,
      qt_meta_data_Enveloppe3DPlugin,  qt_static_metacall, Q_NULLPTR, Q_NULLPTR}
};


const QMetaObject *Enveloppe3DPlugin::metaObject() const
{
    return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
}

void *Enveloppe3DPlugin::qt_metacast(const char *_clname)
{
    if (!_clname) return Q_NULLPTR;
    if (!strcmp(_clname, qt_meta_stringdata_Enveloppe3DPlugin.stringdata0))
        return static_cast<void*>(const_cast< Enveloppe3DPlugin*>(this));
    if (!strcmp(_clname, "org.LIO.MainWindow.BasePluginInterface/1.0"))
        return static_cast< QLIO::BasePluginInterface*>(const_cast< Enveloppe3DPlugin*>(this));
    return QLIO::BasePluginInterface::qt_metacast(_clname);
}

int Enveloppe3DPlugin::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QLIO::BasePluginInterface::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    return _id;
}

QT_PLUGIN_METADATA_SECTION const uint qt_section_alignment_dummy = 42;

#ifdef QT_NO_DEBUG

QT_PLUGIN_METADATA_SECTION
static const unsigned char qt_pluginMetaData[] = {
    'Q', 'T', 'M', 'E', 'T', 'A', 'D', 'A', 'T', 'A', ' ', ' ',
    'q',  'b',  'j',  's',  0x01, 0x00, 0x00, 0x00,
    0xb0, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
    0x9c, 0x00, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00,
    0x03, 0x00, 'I',  'I',  'D',  0x00, 0x00, 0x00,
    '&',  0x00, 'o',  'r',  'g',  '.',  'L',  'I', 
    'O',  '.',  'M',  'a',  'i',  'n',  'W',  'i', 
    'n',  'd',  'o',  'w',  '.',  'B',  'a',  's', 
    'e',  'P',  'l',  'u',  'g',  'i',  'n',  'I', 
    'n',  't',  'e',  'r',  'f',  'a',  'c',  'e', 
    0x1b, 0x0a, 0x00, 0x00, 0x09, 0x00, 'c',  'l', 
    'a',  's',  's',  'N',  'a',  'm',  'e',  0x00,
    0x11, 0x00, 'E',  'n',  'v',  'e',  'l',  'o', 
    'p',  'p',  'e',  '3',  'D',  'P',  'l',  'u', 
    'g',  'i',  'n',  0x00, ':',  0xe0, 0xa0, 0x00,
    0x07, 0x00, 'v',  'e',  'r',  's',  'i',  'o', 
    'n',  0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
    0x05, 0x00, 'd',  'e',  'b',  'u',  'g',  0x00,
    0x15, 0x12, 0x00, 0x00, 0x08, 0x00, 'M',  'e', 
    't',  'a',  'D',  'a',  't',  'a',  0x00, 0x00,
    0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
    0x80, 0x00, 0x00, 0x00, '@',  0x00, 0x00, 0x00,
    't',  0x00, 0x00, 0x00, 'd',  0x00, 0x00, 0x00
};

#else // QT_NO_DEBUG

QT_PLUGIN_METADATA_SECTION
static const unsigned char qt_pluginMetaData[] = {
    'Q', 'T', 'M', 'E', 'T', 'A', 'D', 'A', 'T', 'A', ' ', ' ',
    'q',  'b',  'j',  's',  0x01, 0x00, 0x00, 0x00,
    0xb0, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
    0x9c, 0x00, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00,
    0x03, 0x00, 'I',  'I',  'D',  0x00, 0x00, 0x00,
    '&',  0x00, 'o',  'r',  'g',  '.',  'L',  'I', 
    'O',  '.',  'M',  'a',  'i',  'n',  'W',  'i', 
    'n',  'd',  'o',  'w',  '.',  'B',  'a',  's', 
    'e',  'P',  'l',  'u',  'g',  'i',  'n',  'I', 
    'n',  't',  'e',  'r',  'f',  'a',  'c',  'e', 
    0x15, 0x0a, 0x00, 0x00, 0x08, 0x00, 'M',  'e', 
    't',  'a',  'D',  'a',  't',  'a',  0x00, 0x00,
    0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x9b, 0x0d, 0x00, 0x00,
    0x09, 0x00, 'c',  'l',  'a',  's',  's',  'N', 
    'a',  'm',  'e',  0x00, 0x11, 0x00, 'E',  'n', 
    'v',  'e',  'l',  'o',  'p',  'p',  'e',  '3', 
    'D',  'P',  'l',  'u',  'g',  'i',  'n',  0x00,
    '1',  0x00, 0x00, 0x00, 0x05, 0x00, 'd',  'e', 
    'b',  'u',  'g',  0x00, ':',  0xe0, 0xa0, 0x00,
    0x07, 0x00, 'v',  'e',  'r',  's',  'i',  'o', 
    'n',  0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
    '@',  0x00, 0x00, 0x00, '\\', 0x00, 0x00, 0x00,
    0x80, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00
};
#endif // QT_NO_DEBUG

QT_MOC_EXPORT_PLUGIN(Enveloppe3DPlugin, Enveloppe3DPlugin)

QT_END_MOC_NAMESPACE

BasePluginInterface.h

Теперь есть еще кое-что в BasePluginInterface, но нет другого абстрактные методы или что-либо еще, что должно быть установлено при инициализации приложения. Я знаю это, потому что я ставлю точки останова во всех методах этого абстрактного класса, и ни один из них не срабатывает до сбоя приложения, а также потому, что базовый класс работает для других примеров.

namespace QLIO
{
    class DLLPLUGIN_EXPORT BasePluginInterface : public QObject
    {
        Q_OBJECT

    public:
        BasePluginInterface( const QString& in_PluginName, PluginPriorityLoad in_Priority )
            : m_PluginName( in_PluginName )
            , m_LoadPriority( in_Priority )
            , m_StateMachine( nullptr )
        {}

        virtual ~BasePluginInterface()
        {}

        virtual void initialize( LIO::Element* io_RootData, QLIO::Presenter* io_RootPresenter ) = 0;

    protected:
        QString  m_PluginName;
        PluginPriorityLoad m_LoadPriority;
        QState* m_StateMachine;
    }
} 

Q_DECLARE_INTERFACE( QLIO::BasePluginInterface, "org.LIO.MainWindow.BasePluginInterface/1.0" )

Исключение возникает в Q_OBJECT строка с указанием (я перевожу это с французского, надеюсь, это будет значимый перевод)

Возникло исключение: нарушение прав чтения ** priv ** (...) вернул nullptr произошло.

Вот оригинальное французское сообщение, на случай, если кто-нибудь сможет перевести его лучше:

Исключительный уровень: нарушение лекций. ** priv ** (...) retournée nullptr. eu lieu

Отслеживание стека:

Qt5Cored.dll!objectClassName(const QMetaObject * m) Ligne 306   C++
Qt5Cored.dll!QMetaObject::tr(const char * s, const char * c, int n) Ligne 375   C++
Enveloppe3DPlugin.dll!Enveloppe3DPlugin::tr(const char * s, const char * c, int n) Ligne 7  C++
Enveloppe3DPlugin.dll!`dynamic initializer for 'PLUGIN_NAME''() Ligne 3 C++
[Code externe]
Qt5Cored.dll!QLibraryPrivate::load_sys() Ligne 115  C++
Qt5Cored.dll!QLibraryPrivate::load() Ligne 538  C++
Qt5Cored.dll!QLibraryPrivate::loadPlugin() Ligne 591    C++
Qt5Cored.dll!QPluginLoader::load() Ligne 239    C++
Qt5Cored.dll!QPluginLoader::instance() Ligne 195    C++
DllPlugin.dll!PluginManager::PluginManager() Ligne 40   C++
SterLIO.exe!MainWindow::MainWindow(QWidget * parent) Ligne 78   C++
SterLIO.exe!main(int argc, char * * argv) Ligne 81  C++
SterLIO.exe!WinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, char * __formal, int __formal) Ligne 123    C++
[Code externe]  

Наконец, поскольку я считаю, что это может быть проблемой конфигурации, вот часть CustomBuild моего .cvxproj, которая связана с При построении Enveloppe3DPlugin.h я склонен опубликовать полный файл проекта, если это необходимо, но я думаю, что проблема может лежать там:

<CustomBuild Include="Enveloppe3DPlugin.h">
  <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
  <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing Enveloppe3DPlugin.h...</Message>
  <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
  <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -D_WINDOWS -DUNICODE -DWIN32 -DQT_PLUGIN -DQT_CORE_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_DLL -D_WINDLL "-I.\..\..\MainWindow\PluginManager" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\include" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\include\QtGui" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\include\QtCore" "-I.\debug" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\mkspecs\win32-msvc2013" "-I.\GeneratedFiles" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui"</Command>
  <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
  <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing Enveloppe3DPlugin.h...</Message>
  <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
  <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -D_WINDOWS -DQT_CORE_LIB -DQT_PLUGIN -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_DLL "-DTEST_DATA_PATH=$(FLAVATestDataDir)\." -D_WINDLL "-I.\..\..\..\QtLibraries" "-I.\..\..\..\..\LIOAlgorithms\Sources" "-I$(TPDir)\." "-I$(EigenDir)\." "-I$(PugiXmlDir)\." "-I$(NanoFlannDir)\." "-I$(PNGDir)\." "-I$(PNGDir)\scripts" "-I$(PngCppDir)\." "-I$(GDCMDir)\include" "-I$(GlewDir)\Include" "-I$(BoostDir)\." "-I$(CryptoDir)\." "-I$(TPDir)\libigl\include" "-I$(TPDir)\fftw\fftw-3.3.4\api" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui"</Command>
  <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
  <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing Enveloppe3DPlugin.h...</Message>
  <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
  <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -D_WINDOWS -DUNICODE -DWIN32 -DQT_NO_DEBUG -DQT_PLUGIN -DQT_CORE_LIB -DNDEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_DLL -D_WINDLL "-I.\..\..\MainWindow\PluginManager" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\include" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\include\QtGui" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\include\QtCore" "-I.\release" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\mkspecs\win32-msvc2013" "-I.\GeneratedFiles" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui"</Command>
  <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
  <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing Enveloppe3DPlugin.h...</Message>
  <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
  <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -D_WINDOWS -DNDEBUG -DQT_CORE_LIB -DQT_NO_DEBUG -DQT_PLUGIN -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_DLL "-DTEST_DATA_PATH=$(FLAVATestDataDir)\." -D_WINDLL "-I.\..\..\..\QtLibraries" "-I.\..\..\..\..\LIOAlgorithms\Sources" "-I$(TPDir)\." "-I$(EigenDir)\." "-I$(PugiXmlDir)\." "-I$(NanoFlannDir)\." "-I$(PNGDir)\." "-I$(PNGDir)\scripts" "-I$(PngCppDir)\." "-I$(GDCMDir)\include" "-I$(GlewDir)\Include" "-I$(BoostDir)\." "-I$(CryptoDir)\." "-I$(TPDir)\libigl\include" "-I$(TPDir)\fftw\fftw-3.3.4\api" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui"</Command>
</CustomBuild>

И часть ProjectExtensions файла проекта :

<ProjectExtensions>
  <VisualStudio>
    <UserProperties UicDir=".\GeneratedFiles" RccDir=".\GeneratedFiles" Qt5Version_x0020_x64="$(DefaultQtVersion)" />
  </VisualStudio>
</ProjectExtensions>

В последние несколько дней я много искал причины своей проблемы, но не смог понять, даже этот минимальный пример не работает, хотя я должен упомянуть код работает в режиме Release, но плагин не загружается в мое приложение.

Итак, в чем причина этого не столь очевидного исключения?

1 Ответ

0 голосов
/ 07 февраля 2020

Проблема заключалась в том, что мне нужно было исключить файл, сгенерированный из Release, когда я работал в режиме Debug и наоборот, что привело к следующему решению:

<ClCompile Include="GeneratedFiles\Debug\moc_Enveloppe3DPlugin.cpp">
  <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
  <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_Enveloppe3DPlugin.cpp">
  <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
  <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
</ClCompile>
...