无需制定目标.moc

时间:2019-03-27 03:50:47

标签: c++ qt openvpn

我试图将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次。尽管如此,它仍然拒绝工作。我在做什么错了?

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 个答案:

答案 0 :(得分:2)

TL; DR

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

上下文

您(几乎)不必包含.moc文件。 Moc文件由moc编译器自动创建,并在专用翻译单元中进行编译和链接(例如,与任何.cpp文件一样)。

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

潜在问题

关于您的特定问题,moc个文件问题可能源于:

  • 缺少Q_OBJECT关键字(但您有)。该令牌用于触发该特定类的.moc文件的生成。没有它,大多数QObject功能都将丢失。
  • 该类以前是在没有Q_OBJECT关键字的情况下 进行解析/编译的,并作为非QObject类进行缓存。在这种情况下,您只需手动删除您的构建文件夹(或手动运行qmake),以强制再次标识应该moc编辑的类。
  • 您为moc编辑的文件使用了错误的文件名。正确的名称通常是
    • 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