应用内置规则,而不是生成文件中的特定规则

问题描述 投票:0回答:2

我正在使用这两个makefile:

$ cat Makefile
#-- TARGET definition :
TARGET_TYPE=exe#one of : exe, lib, default to exe
TARGET=test_bmpfile_save
#-- libs definition :
LIBS=libbmpfile#list of libs which must be recompiled by this Makefile
STDLIBS=libm#list of list which must be include to compile
#-- definitions for each lib from $(LIBS):
bmpfile_DIR=..#mandatory, directory containing both library and its Makefile.
bmpfile_INC=..#optionnal, default to lib_DIR : dirname containing lib's headers files.
#-- srcs definition :
SRCS=bmpfile_save
SRCS_DIRS=
SRCS_INCS=.#
#-- IMPORTANT :
GEN_MAKEFILE_PATH=../../../fw/
#
#---- dont change anything after this
#--------------------------------------------------------------------------------------

include $(GEN_MAKEFILE_PATH)genMakefile

和:

$ cat ../../../fw/genMakefile 
RTARGET_TYPE=$(if $(TARGET_TYPE),$(TARGET_TYPE),exe)
LIBS_FPATHS=$(foreach lib,$(LIBS:lib%=%),$($(lib)_DIR)/lib$(lib).a)
LIBS_DIRS=$(foreach lib,$(LIBS:lib%=%),$($(lib)_DIR))
LDLIBS=$(LIBS_DIRS:%=-L%) $(LIBS:lib%=-l%) $(STDLIBS:lib%=-l%)
LIBS_INCS=$(foreach lib,$(LIBS:lib%=%),$(if $($(lib)_INC),$($(lib)_INC),$($(lib)_DIR)))
IFLAGS=$(SRCS_INCS:%=-I%) $(LIBS_INCS:%=-I%)
CFLAGS=-Wall -Wextra -Werror $(IFLAGS)
empty=
space=$(empty) $(empty)
VPATH=$(subst $(space),:,$(SRCS_DIRS))
vpath lib%.a $(subst $(space),:,$(LIBS_DIRS))

.PHONY:all
all:$(TARGET)

ifeq ($(RTARGET_TYPE),exe)
$(TARGET):$(LIBS:%=%.a) $(SRCS:%.c=%.o)
        gcc $(CFLAGS) $(SRCS:%.c=%.o)  -o $@ $(LDLIBS)#This recipe is not applied

else
$(TARGET): $(LIBS:%=%.a) $(SRCS:%.c=%.o)
        ar -rc $@ $(LIBS_FPATHS) $(SRCS:%.c=%.o)
        ranlib $@
endif

ifneq ($(LIBS),)
lib%.a:
        $(MAKE) -C $($*_DIR)
endif

.PHONY:$(LIBS:%=%.fclean)
lib%.fclean:
        $(MAKE) -C $($*_DIR) fclean

.PHONY:clean
clean:
        rm -f $(wildcard *.o)

.PHONY: fclean
fclean:$(LIBS:%=%.fclean) clean
        rm -f $(TARGET)

.PHONY:re
re:fclean $(TARGET)

[当我第一次使用make时,我希望应用$(TARGET)规则...然后是输出:

$ make
cc -Wall -Wextra -Werror -I. -I..    bmpfile_save.c  -L.. -lbmpfile -lm -o bmpfile_save
../libbmpfile.a(bmpfile_save.o): In function `write_headers':
/home/david/42Projects/minirt/srcs/bmpfile/bmpfile_save.c:17: undefined reference to `t_sys_init'
/home/david/42Projects/minirt/srcs/bmpfile/bmpfile_save.c:21: undefined reference to `ft_bzero'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'bmpfile_save' failed
make: *** [bmpfile_save] Error 1


相反,make似乎适用this built-in rule(这是我发现的唯一[适用于此的),尽管可执行文件的名称与任何.o文件名都不匹配...我不明白为什么似乎要应用此规则(如果适用)。我想念什么?

makefile gnu-make
2个回答
0
投票
您写的是:

$(TARGET):$(LIBS:%=%.a) $(SRCS:%.c=%.o) this rule is not used... at all ^^

您的makefile中到底有什么?不能完全如上,因为这是语法错误。

0
投票
没关系,先决条件中的.o文件调用了内置规则...对于这个愚蠢的问题,感到抱歉。
© www.soinside.com 2019 - 2024. All rights reserved.