Я унаследовал проект, построенный с использованием:
- 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
, но плагин не загружается в мое приложение.
Итак, в чем причина этого не столь очевидного исключения?