我试图将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:
. . .
只需删除您的build-xxx
文件夹,然后从头开始重建!
你(几乎)永远不必包含.moc
文件。 Moc文件由moc
ompiler自动创建,并在专用翻译单元(即任何.cpp
文件)中编译和链接。
唯一的例外是当你的QObject
类在cpp
文件中声明时(恰好是你的情况!),因为.moc
实现仍然需要你的类定义来编译。正如评论中所建议的,有一个详细的解释here。
关于您的具体问题,moc
文件问题可能源于:
Q_OBJECT
关键字(但你有)。此标记用于触发为该特定类生成.moc
文件。没有它,大多数QObject功能都会丢失。Q_OBJECT
关键字的情况下,先前已经解析/编译了类,并将其作为非QObject类进行了缓存。在这种情况下,您只需手动删除您的构建文件夹(或手动运行qmake
),以强制再次识别哪些类应该是moc
ed。moc
ed文件的文件名错误。通常是正确的名称
当您的类在头文件中声明时,moc_filename.cpp
当您的类在源文件中声明时,filename.moc
qmake
实际上并不解析你的.cpp
文件。如果您的.pro
文件不包含在SOURCES
变量中,或者您从未运行qmake
(特定设置等),则可能出现这种情况。你可以仔细检查你的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