Проблема с созданием файлов MO C для QT с помощью make-файла - PullRequest
0 голосов
/ 03 августа 2020

Здравствуйте, я пытаюсь сгенерировать MOC файлы для QT с помощью makeifle. Проблема в том, что команда выполняется откуда-то, и я не могу найти откуда .... Это мой make-файл

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.

Я хочу сгенерировать файл MOC из DialogBox.h.

Проблема в этой команде:

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 почему?

1 Ответ

0 голосов
/ 03 августа 2020

Я наконец исправил это. Как @GM предложил в комментариях, вероятно, выполняется неявное правило, поэтому я решил написать свое, чтобы избежать этого. Я добавил это:

$(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 $<

, и все работает нормально.

Полный make-файл:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...