无需规则即可将目标设为 .moc
No rule needed to make target .moc
我正在尝试将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:
. . .
TL;博士
只需删除您的build-xxx
文件夹,然后从头开始重建!
上下文
您(几乎)永远不必包含.moc
文件。Moc 文件由moc
ompiler 自动创建,并在专用的翻译单元中编译和链接(即与任何.cpp
文件一样)。
唯一的例外是在cpp
文件中声明QObject
类时(恰好是这种情况!),因为.moc
实现仍然需要类定义来编译。正如评论中所建议的,这里有一个详细的解释。
潜在问题
关于您的特定问题,moc
文件问题可能源于:
- 缺少
Q_OBJECT
关键字(但您有它)。此令牌用于触发该特定类的.moc
文件的生成。没有它,大多数QObject功能都会丢失。 - 该类以前在没有
Q_OBJECT
关键字的情况下被解析/编译,并缓存为非 QObject 类。在这种情况下,您只需手动删除构建文件夹(或手动运行qmake
),即可再次强制识别应moc
哪些类。 - 您对
moc
ed 文件使用了错误的文件名。正确的名称通常是moc_filename.cpp
在头文件中声明类时filename.moc
在源文件中声明类的时间
qmake
实际上不会解析您的.cpp
文件。如果您的.pro
文件未将其包含在SOURCES
变量中,或者您只是从未运行过qmake
(特定设置等),则可能会出现这种情况。
示例生成文件
您可以仔细检查您的moc
文件在其项目的 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
相关文章:
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++A*算法并不总是在路径中具有目标节点
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 为测试目标创建具有不同源文件夹的文件
- 使用源向量作为目标
- 是否可以用C++/WinRT将windows 10.0.14393作为目标
- 在 CMake 中为每个目标设置编译器/链接器标志
- qmake:检测目标位宽(32 位或 64 位)
- 如何在 CMake 中对目标依赖项进行分组?
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 如何为包含头文件的目标编写生成文件?
- 线性优化目标函数中的绝对值
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- 字符串函数在目标C++上运行时C++返回空
- 如何定义自定义生成配置类型,其中通常是.exe的目标改为 DLL
- 请求最简单的 OpenMP 目标 GPU 示例
- LLVM 编译:目标的配方 '../lib/IR/Release+Asserts/Intrinsics.gen.tmp' failed
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 无需规则即可将目标设为 .moc
- 目标'o.le-v7-g/.moc/moc_applicationui.cpp'配方失败