Для создания цели .moc не требуется никаких правил - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь превратить пример ovpncli в ovpn3 в класс, производный от QObject.Я не могу превратить исходный файл в отдельный файл интерфейса (.h) и реализации (.cpp).Чтобы сделать MOC счастливым, я поставил #include "openvpn.moc" в конце openvpn.cpp (исходный файл).Однако я получаю эту ошибку: :-1: error: No rule to make target 'openvpn.moc', needed by 'openvpnmanager.o'. Stop. Я очистил каталог сборки, перезапустил qmake и перестроил его 1000 раз.Несмотря на это, он все еще отказывается работать.Что я делаю не так?

myproject.pro:

QT       += core widgets network
CONFIG += c++11
UI_SOURCES_DIR = src/gui
UI_HEADERS_DIR = include

. . .

SOURCES += \
    src/main.cpp \
    src/gui/loginwindow.cpp \
    src/api/api.cpp \
    src/openvpn/openvpn.cpp \
    src/alert.cpp \
    src/gui/vpn.cpp \
    src/api/account.cpp \
    src/crypto.cpp \
    src/killswitch.cpp \
    src/vpnstatus.cpp \
    src/gui/logdialog.cpp \
    src/logitem.cpp \
    src/authenticationworker.cpp \
    src/api/error.cpp \
    src/openvpn/openvpnmanager.cpp \
    src/api/server.cpp \
    src/api/authenticationresponse.cpp

HEADERS += \
    include/loginwindow.h \
    include/api.h \
    include/alert.h \
    include/vpn.h \
    include/account.h \
    include/crypto.h \
    include/killswitch.h \
    include/configtype.h \
    include/vpnstatus.h \
    include/connectionstatus.h \
    include/loglevel.h \
    include/logdialog.h \
    include/logitem.h \
    include/authenticationworker.h \
    include/error.h \
    include/openvpnmanager.h \
    include/server.h \
    include/authenticationresponse.h \

FORMS += \
    src/gui/loginwindow.ui \
    src/gui/vpn.ui \
    src/gui/logdialog.ui

RESOURCES += \
    src/resources.qrc

DISTFILES +=

openvpn.cpp:

class Client : public QObject, public ClientAPI::OpenVPNClient {
    Q_OBJECT
public:
    . . .

1 Ответ

2 голосов
/ 27 марта 2019

TL; DR

Просто удалите папку build-xxx и восстановите ее с нуля!

Context

Вам (почти) никогда не придется включать .mocфайл.Файлы Moc создаются автоматически компилятором moc, компилируются и связываются в выделенном модуле перевода (т. Е. Как любой файл .cpp).

Единственное исключение - это когда ваш класс QObject объявлен вФайл cpp (это ваш случай!), Потому что реализация .moc по-прежнему требует компиляции вашего определения класса.Как предлагается в комментариях, здесь есть подробное объяснение здесь .

Потенциальные проблемы

Что касается вашей конкретной проблемы, moc проблемы с файлами могут возникать из:

  • ключевое слово Q_OBJECT отсутствует (но оно у вас есть).Этот токен используется для запуска генерации файла .moc для этого конкретного класса.Без него большинство функций QObject отсутствуют.
  • класс был ранее проанализирован / скомпилирован без ключевого слова Q_OBJECT и кэширован как класс не-QObject.В этом случае вам просто нужно вручную удалить папку сборки (или запустить qmake вручную), чтобы снова определить, какие классы должны быть moc ed.
  • Вы используетенеправильное имя файла для вашего moc ed файла.Правильное имя обычно
    • moc_filename.cpp, когда ваш класс объявлен в заголовочном файле
    • filename.moc, когда ваш класс объявлен в исходном файле
  • qmake фактически не анализирует ваш .cpp файл.Это может быть в том случае, если ваш .pro файл не включает его в переменную SOURCES, или если вы просто никогда не запускаете qmake (особые настройки и т. Д.)

ПримерMakefile

Вы можете дважды проверить, что ваши moc файлы имеют соответствующие правила в Makefile своего проекта.Ниже приведен пример части Makefile:

compiler_moc_source_make_all: mysourcefile.moc

compiler_moc_source_clean:
    -$(DEL_FILE) mysourcefile.moc

mysourcefile.moc: /home/aleravat/Qt/5.9.7/gcc_64/include/QtCore/QCoreApplication \
        /home/aleravat/Qt/5.9.7/gcc_64/include/QtCore/qcoreapplication.h \
        /home/aleravat/Qt/5.9.7/gcc_64/include/QtCore/qglobal.h \
        /home/aleravat/Qt/5.9.7/gcc_64/include/QtCore/qconfig-bootstrapped.h \
        # [...] more includes
    /home/aleravat/Qt/5.9.7/gcc_64/bin/moc $(DEFINES) --include ./moc_predefs.h [...] mysourcefile.cpp -o mysourcefile.moc
...