Создание простого проекта удаленных объектов 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.

0 ответов

Другие вопросы по тегам