【发布时间】:2020-08-03 14:36:54
【问题描述】:
您好,我正在尝试使用 makeifle 为 QT 生成 MOC 文件。
问题是命令正在从某个地方执行,我无法从哪里找到......
这是我的makefile
BUILD = Build
### SOURCES ###
SRC = Src/Main\
Src/DialogBox/DialogBox
### MOC SOURCES ###
MOC_SRC = Src/DialogBox/DialogBox
### OBJECTS ###
OBJ = $(addsuffix .o, $(addprefix $(BUILD)/, $(SRC)))
OBJ += $(addsuffix .moc.o, $(addprefix $(BUILD)/, $(MOC_SRC)))
### INCLUDES ###
INC = TOO MANY INCLUDES TO PUT HERE....
### LINKER FLAGS ###
LDFLAGS = -LC:/Qt/5.15.0/mingw81_32/lib
LDLIBS = -lQt5Quick -lQt5PrintSupport -lQt5Qml -lQt5Network -lQt5Widgets -lQt5Gui -lQt5Core
### COMPILER FLAGS
CFLAGS = $(INC)
### COMPILER ###
CC = g++
### QT MOC ###
MOC = moc
all: $(BUILD)/test.exe
$(BUILD)/test.exe: $(OBJ)
@echo LINKING $^
@$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
$(BUILD)/%.o: %.cpp
@echo COMPILING $<
@mkdir -p $(subst /,\,$(dir $@))
@$(CC) $(CFLAGS) -M -MT $@ -o $(patsubst %.o, %.d, $@) $<
@$(CC) $(CFLAGS) -o $@ -c $<
$(BUILD)/%.moc.cpp: %.h
@echo MOCCING $<
$(MOC) $< -o $@
@echo MOC END
-include $(OBJ:.o=.d)
.PHONY: clean
clean:
@echo CLEANING......
@rm -rf $(BUILD)/Src $(BUILD)/test.exe
这是结果:
COMPILING Src/Main.cpp
COMPILING Src/DialogBox/DialogBox.cpp
MOCCING Src/DialogBox/DialogBox.h
moc Src/DialogBox/DialogBox.h -o Build/Src/DialogBox/DialogBox.moc.cpp
MOC END
g++ -c -o Build/Src/DialogBox/DialogBox.moc.o Build/Src/DialogBox/DialogBox.moc.cpp
In file included from Build/Src/DialogBox/DialogBox.moc.cpp:10:0:
Build/Src/DialogBox/../../../Src/DialogBox/DialogBox.h:4:19: fatal error: QDialog: No such file or directory
#include "QDialog"
^
compilation terminated.
make: *** [<builtin>: Build/Src/DialogBox/DialogBox.moc.o] Error 1
rm Build/Src/DialogBox/DialogBox.moc.cpp
基本上我只有两个源文件:Main.cpp 和 DialogBox.cpp。
我想从DialogBox.h 生成MOC 文件。
问题是这个命令:
g++ -c -o Build/Src/DialogBox/DialogBox.moc.o Build/Src/DialogBox/DialogBox.moc.cpp
我不明白它为什么会执行......
编辑:
甚至之后:
MOCCING Src/DialogBox/DialogBox.h
moc Src/DialogBox/DialogBox.h -o Build/Src/DialogBox/DialogBox.moc.cpp
MOC END
没有这样的文件Build/Src/DialogBox/DialogBox.moc.cpp 存在。为什么?
【问题讨论】:
-
因为构建的目标最终依赖于
$(OBJ),而Build/Src/DialogBox/DialogBox.moc.o是$(OBJ)中的一个组件。还是我错过了什么? -
@G.M.但是命令是从哪里来的?这样的命令没有规则。
-
但是有。使用
$(BUILD)/%.o: %.cpp的规则将匹配%的词干Src/DialogBox/DialogBox.moc。 -
为什么我看不到来自 $(CFLAGS) 的包含?它与以下逗号不同:@$(CC) $(CFLAGS) -o $@ -c $
-
那么我怀疑正在调用一个或多个隐式规则,因为显示的规则与您的路径名不匹配(我不认为)。