没有规则需要制作目标.moc

问题描述 投票:1回答:1

我试图将ovpn3的ovpncli示例变成一个派生自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次。尽管如此,它仍然拒绝工作。我究竟做错了什么?

没有project.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:
    . . .
c++ qt openvpn
1个回答
2
投票

TL;DR

只需删除您的build-xxx文件夹,然后从头开始重建!

Context

你(几乎)永远不必包含.moc文件。 Moc文件由mocompiler自动创建,并在专用翻译单元(即任何.cpp文件)中编译和链接。

唯一的例外是当你的QObject类在cpp文件中声明时(恰好是你的情况!),因为.moc实现仍然需要你的类定义来编译。正如评论中所建议的,有一个详细的解释here

Potential issues

关于您的具体问题,moc文件问题可能源于:

  • 缺少Q_OBJECT关键字(但你有)。此标记用于触发为该特定类生成.moc文件。没有它,大多数QObject功能都会丢失。
  • 在没有Q_OBJECT关键字的情况下,先前已经解析/编译了类,并将其作为非QObject类进行了缓存。在这种情况下,您只需手动删除您的构建文件夹(或手动运行qmake),以强制再次识别哪些类应该是moced。
  • 您使用的moced文件的文件名错误。通常是正确的名称 当您的类在头文件中声明时,moc_filename.cpp 当您的类在源文件中声明时,filename.moc
  • qmake实际上并不解析你的.cpp文件。如果您的.pro文件不包含在SOURCES变量中,或者您从未运行qmake(特定设置等),则可能出现这种情况。

Sample 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
© www.soinside.com 2019 - 2024. All rights reserved.