我试图将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:
. . .
答案 0 :(得分:2)
只需删除您的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
(特定设置等),则可能是这种情况。您可以再次检查其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