Создание простого проекта удаленных объектов Qt на MSVC 2017
Qt 5.13.2
MS Visual Studio 2017
Qt, интегрированный в MSVS с помощью Qt Visual Studio Tools (qt-vsaddin-msvc2017-2.4.2.vsix).
Невозможно создать простой проект с удаленными объектами:
MyPeer.rep
#include <QtCore>
#include <QString>
class MyPeer
{
PROP(bool active);
SLOT(void setMessage(QString str));
};
MyPeerHost.h
#ifndef MyPeerHost_h__
#define MyPeerHost_h__
#include "rep_MyPeer_source.h"
class MyPeerHost : public MyPeerSimpleSource
{
Q_OBJECT
public:
MyPeerHost(QObject *parent = nullptr);
~MyPeerHost();
public slots:
void setMessage(QString str) override;
};
#endif // MyPeerHost_h__
MyPeerHost.cpp
#include "MyPeerHost.h"
MyPeerHost::MyPeerHost(QObject *parent /*= nullptr*/)
{
}
MyPeerHost::~MyPeerHost()
{
}
void MyPeerHost::setMessage(QString str)
{
}
main.cpp
#include <QtCore/QCoreApplication>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
return a.exec();
}
project properties
-> Qt Remote Objects Compiler
-> repc
:
В $(IntDir)\repc\
путь также добавлен в project properties
-> C/C++
-> General
-> Additional Include Directories
.
Инструмент repc кажется, генерируется правильноrep_MyPeer_source.h
с правильно классом MyPeerSimpleSource
.
Вывод сборки MSVC:
1>------ Rebuild All started: Project: RTest, Configuration: Debug Win32 ------
1>Reading Qt configuration (C:\Qt\5.13.2\msvc2017\bin\qmake.exe)
1>repc MyPeer.rep
1>moc MyPeerHost.h
1>main.cpp
1>MyPeerHost.cpp
1>moc_MyPeerHost.cpp
1>MyPeerHost.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall MyPeerSource::metaObject(void)const " (?metaObject@MyPeerSource@@UBEPBUQMetaObject@@XZ)
1>MyPeerHost.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall MyPeerSource::qt_metacast(char const *)" (?qt_metacast@MyPeerSource@@UAEPAXPBD@Z)
1>MyPeerHost.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall MyPeerSource::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyPeerSource@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>MyPeerHost.obj : error LNK2019: unresolved external symbol "public: void __thiscall MyPeerSource::activeChanged(bool)" (?activeChanged@MyPeerSource@@QAEX_N@Z) referenced in function "public: virtual void __thiscall MyPeerSimpleSource::setActive(bool)" (?setActive@MyPeerSimpleSource@@UAEX_N@Z)
1>MyPeerHost.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall MyPeerSimpleSource::metaObject(void)const " (?metaObject@MyPeerSimpleSource@@UBEPBUQMetaObject@@XZ)
1>MyPeerHost.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall MyPeerSimpleSource::qt_metacast(char const *)" (?qt_metacast@MyPeerSimpleSource@@UAEPAXPBD@Z)
1>moc_MyPeerHost.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall MyPeerSimpleSource::qt_metacast(char const *)" (?qt_metacast@MyPeerSimpleSource@@UAEPAXPBD@Z)
1>MyPeerHost.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall MyPeerSimpleSource::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyPeerSimpleSource@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>moc_MyPeerHost.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall MyPeerSimpleSource::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyPeerSimpleSource@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>moc_MyPeerHost.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const MyPeerSimpleSource::staticMetaObject" (?staticMetaObject@MyPeerSimpleSource@@2UQMetaObject@@B)
1>C:\Users\Ber\source\repos\RTest\Win32\Debug\\RTest.exe : fatal error LNK1120: 8 unresolved externals
1>Done building project "RTest.vcxproj" -- FAILED.
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
Решения из вопроса " Неразрешенный внешний символ"public: virtual struct QMetaObject const * __thiscall Parent не помогают.
Редактировать. Я экспортировал проект в QtCreator стандартным способом, немного отредактировал файл.pro:
RTest.pro
TEMPLATE = app
QT += remoteobjects core
QT -= gui
TARGET = RTest
DESTDIR = ../Win32/Debug
CONFIG += debug console
LIBS += -L"."
DEPENDPATH += .
REPC_SOURCE = ./MyPeer.rep
MOC_DIR += ./GeneratedFiles/$(ConfigurationName)
OBJECTS_DIR += debug
UI_DIR += ./GeneratedFiles
RCC_DIR += ./GeneratedFiles
include(RTest.pri)
RTest.pri стандартный:
HEADERS += ./MyPeerHost.h \
$$PWD/MyPeer.rep
SOURCES += ./main.cpp \
./MyPeerHost.cpp
И обнаружил, что проект QtCreator работает (с тем же компилятором msvc 2017). Другое дело, что QtCreator сгенерировал 3 файла moc_:
moc_rep_MyPeer_source.cpp
moc_MyPeerHost.cpp
moc_predefs.h
в то время как проект MSVS генерирует только один файл moc...:
moc_MyPeerHost.cpp
После целого дня попыток кажется, что удаленные объекты Qt вообще не работают в MSVS 2017.