【发布时间】:2020-07-17 10:56:56
【问题描述】:
我尝试编译一些 .cpp 文件。使用这个 makefile 代码
.PHONY: all
define CompileModule
$(2): $(1)
$(call __verify_path,$(TMP_DIR))
@echo Compile $(1) to $(2)
$(CC) -c -o $(2) $(1)
endef
$(foreach module,$(ALL_CPP), $(eval $(call CompileModule, $(module), $(addprefix $(TMP_DIR)\, $(addsuffix .o, $(basename $(notdir $(module))))))))
all: | setup $(OUTPUT_FULL_NAME) clean
setup:
@echo Setup...
$(call __verify_path,$(BIN_DIR))
$(call __verify_path,$(TMP_DIR))
$(call __verify_path,$(LIB_DIR))
@echo Setup finished...
clean:
@echo Clean...
$(call __delete_file,$(call __trans,$(TMP_DIR)/*.o))
$(call __delete_file,$(call __trans,$(TMP_DIR)/*.res))
$(call __delete_file,$(call __trans,$(TMP_DIR)/*.cof))
$(call __delete_file,$(call __trans,$(TMP_DIR)/*.c))
$(call __delete_file,$(call __trans,$(TMP_DIR)/*.h))
$(call __delete_path,$(call __trans,$(TMP_DIR)))
@echo Clean finished...
$(OUTPUT_FULL_NAME): $(ALL_OBJ) $(RPC_T_MODULE_OBJ)
@echo Link objects... >&2
$(call __verify_path,$(LIB_DIR))
$(LD) $^ -o $@ $(call __trans,$(L_ATLANTIS)/LIB/crtexe.o) --allow-multiple-definition $(LINK_OPTION) --start-group $(LIB_MODULE_PARAM) --end-group
$(__Strip_DebugInfo__)
$(RPC_T_MODULE) : $(RPC_T_IDL_MODULES)
@echo Run MIDL... >&2
$(MIDL) $(MIDL_OPT) $^
$(RPC_T_MODULE_OBJ): $(RPC_T_MODULE)
@echo Compile IDL module... >&2
$(CC) -c -x c++ -fpermissive -o $@ $^
成功了,但只编译列表中的第一个文件。
好的,我尝试使用此站点的代码(当然,有一些更改):
MakeTarget=$(addprefix $(TMP_DIR)\, $(addsuffix .o, $(basename $(notdir ${1}))))
obj.cpp=
define obj
$(call MakeTarget, ${1}) : ${1}
obj$(suffix ${1}) += $(call MakeTarget, ${1})
$(info ${1} to $(call MakeTarget, ${1}))
endef
define SOURCES
$(foreach src,${1},$(eval $(call obj,${src})))
$(info Foreach finished...)
endef
$(eval $(call SOURCES, $(ALL_CPP)))
all : $(OUTPUT_FULL_NAME) clean
clean:
$(info Clean...)
$(call __delete_file,$(call __trans,$(TMP_DIR)/*.o))
$(call __delete_file,$(call __trans,$(TMP_DIR)/*.res))
$(call __delete_file,$(call __trans,$(TMP_DIR)/*.cof))
$(call __delete_file,$(call __trans,$(TMP_DIR)/*.c))
$(call __delete_file,$(call __trans,$(TMP_DIR)/*.h))
$(call __delete_path,$(call __trans,$(TMP_DIR)))
$(info Clean finished...)
${obj.cpp} : % :
$(info ${obj.cpp})
$(CC) -c -o $@ $^
$(OUTPUT_FULL_NAME): ${obj.cpp} $(RPC_T_MODULE_OBJ)
$(info Link objects... )
$(call __verify_path,$(LIB_DIR))
$(LD) $^ -o $@ $(call __trans,$(L_ATLANTIS)/LIB/crtexe.o) --allow-multiple-definition $(LINK_OPTION) --start-group $(LIB_MODULE_PARAM) --end-group
$(__Strip_DebugInfo__)
$(RPC_T_MODULE) : $(RPC_T_IDL_MODULES)
$(info Run MIDL... )
$(MIDL) $(MIDL_OPT) $^
$(RPC_T_MODULE_OBJ): $(RPC_T_MODULE)
$(info Compile IDL module... )
$(CC) -c -x c++ -fpermissive -o $@ $^
.PHONY: all
同样的结果。
在输出中,我看到带有目标对象的文件列表(右)、“Foreach 完成”、来自 ${obj.cpp} 的目标列表(再次,正确)、用于编译第一个模块的 G++ 字符串(再次,正确) - 仅此而已。在目标目录中,我找到了第一个目标文件。
看起来 Make 在编译第一个文件后立即停止,没有任何消息。
怎么了?
【问题讨论】:
-
在第一个视图中,您似乎为每个文件运行内部 make 子例程,这不是 makefile 通常的工作方式。 “通常”一个生成文件包含规则和先决条件,它只是运行每个规则集的接收。内部函数“$(call...) 或通常用于从某些参数生成通用的东西,但不是任何具体对象/源/目标的一部分。
-
什么操作系统,什么编译器?请在您的问题中显示一些minimal reproducible example。如果没有更多详细信息,您的问题就不清楚了。
-
向我们展示展示您的问题的 C++ 代码。我们猜不出来。
标签: c++ windows makefile mingw