【问题标题】:Issue generating MOC files for QT using a makefile使用 makefile 为 QT 生成 MOC 文件的问题
【发布时间】: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 $
  • 那么我怀疑正在调用一个或多个隐式规则,因为显示的规则与您的路径名不匹配(我不认为)。

标签: qt makefile


【解决方案1】:

我终于修好了。作为@G.M.在 cmets 中建议,可能正在执行一个隐式规则,所以我决定编写自己的规则来避免这种情况。 我添加了这个:

$(BUILD)/%.moc.o: $(BUILD)/%.moc.cpp
    @echo COMPILING MOC $<
    @mkdir -p $(subst /,\,$(dir $@))
    @$(CC) $(CFLAGS) -M -MT $@ -o $(patsubst %.o, %.d, $@) $<
    @$(CC) $(CFLAGS) -o $@ -c $<

一切正常。

完整的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.o: $(BUILD)/%.moc.cpp
    @echo COMPILING MOC $<
    @mkdir -p $(subst /,\,$(dir $@))
    @$(CC) $(CFLAGS) -M -MT $@ -o $(patsubst %.o, %.d, $@) $<
    @$(CC) $(CFLAGS) -o $@ -c $<
    
$(BUILD)/%.moc.cpp: %.h
    @echo GENERATING MOC $<
    @$(MOC) $< -o $@
    
-include $(OBJ:.o=.d) 
    
.PHONY: clean

clean:
    @echo CLEANING......
    @rm -rf $(BUILD)/Src $(BUILD)/test.exe

【讨论】:

  • 题外话:为什么subst在做mkdir的时候?你似乎没有为其他食谱这样做,例如。干净
  • 因为 windows 使用 \ 而 make 使用 /。我猜它不起作用,我不得不更改斜杠。
猜你喜欢
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多