如何修正Make规则,解决GTK项目无法生成.ui文件的报错?
问题分析与Makefile修正
问题根源
- 路径不匹配:你定义的
COMPILED_BP变量指向当前目录下的.ui文件,但实际编译后的.ui会生成到$(COMPILED_BP_DIR)目录中,导致gresource目标依赖的文件路径不存在,Make无法找到对应的构建规则。 - 规则路径错误:原
%.ui: %.bp规则假设.bp源文件在当前目录、生成的.ui也在当前目录,但实际源文件在$(BP_SOURCE_DIR),目标文件需要放到$(COMPILED_BP_DIR),规则的路径匹配完全错误。
修正后的Makefile
BP_SOURCE_DIR = mpyd-ui/bp GRESOURCE_DIR = org/navi/mpyd GRESOURCE_FILE = mpyd.gresource.xml GRESOURCE_PREFIX = /org/navi/mpyd COMPILED_BP_DIR = $(GRESOURCE_DIR)/templates GRESOURCE = $(subst .xml,,$(GRESOURCE_FILE)) # 保留源文件完整路径,避免丢失位置信息 BP_SOURCES = $(shell find $(BP_SOURCE_DIR) -name '*.bp') # 生成目标文件的完整路径:COMPILED_BP_DIR/xxx.ui COMPILED_BP = $(patsubst $(BP_SOURCE_DIR)/%.bp,$(COMPILED_BP_DIR)/%.ui,$(BP_SOURCES)) gresource: $(COMPILED_BP) python3 generate_g_resources.py \ $(GRESOURCE_FILE) \ $(GRESOURCE_DIR) \ $(GRESOURCE_PREFIX) \ $(notdir $(COMPILED_BP)) # 传递文件名即可,可根据脚本需求调整 # 明确源文件与目标文件的目录位置,正确匹配构建规则 $(COMPILED_BP_DIR)/%.ui: $(BP_SOURCE_DIR)/%.bp blueprint-compiler compile --output $@ $< .PHONY: all all: dirs gresource .PHONY: clean clean: rm -r $(GRESOURCE_DIR) ||: rm $(GRESOURCE_FILE) ||: rm $(GRESOURCE) ||: .PHONY: dirs dirs: mkdir -p $(GRESOURCE_DIR) mkdir -p $(COMPILED_BP_DIR)
关键修改说明
- 修正目标文件路径:用
patsubst将源文件路径替换为目标文件路径,让COMPILED_BP指向实际要生成的.ui文件位置,确保Make能识别需要构建的对象。 - 重构构建规则:将规则改为
$(COMPILED_BP_DIR)/%.ui: $(BP_SOURCE_DIR)/%.bp,明确源文件和目标文件的目录,让Make能正确匹配并执行编译命令。 - 使用自动变量:用
$@(目标文件)和$<(第一个依赖文件)简化编译命令,避免硬编码路径,提升规则通用性。 - 保留源文件完整路径:移除
notdir,让BP_SOURCES保留源文件的完整路径,确保路径替换逻辑正确。
内容的提问来源于stack exchange,提问作者PortableNavi
相关产品推荐
相关产品推荐

