我用一个makefile编译多个目标,到目前为止效果非常好。我的问题是其中一个目标共享一个.h文件(hash.h
),它根据宏的变化而变化:HASHTABLE_USING_LISTS
因此,当运行Makefile时,会编译everythin,但practica2_list_bench
应该使用定义了HASHTABLE_USING_LISTS
的版本,最终会链接到旧的.o
对象。在没有它的情况下编译。
最终会导致整个程序中的内存损坏以及漂亮的SIGSEV
。
很明显,每当.h文件发生变化时,我必须以某种方式告诉Makefile重新编译(在这种情况下,它通过指定该宏来改变)。
这是我的所有Makefile:
.SECONDEXPANSION:
# This is the makefile that generates the executable
# If compiing with -ansi, we should use
# -Wno-error=implicit-function-declaration -Wno-implicit-function-declaration
CFLAGS = -Wall -Werror -g
LFLAGS = -lm
INCLUDE_BENCH = -I$(CURDIR) -Ibenchmark
FILES_O =
FILES_C =
TARGET = practica2
CURRENT =
NAME = $(TARGET)
NAME_BENCH = $(TARGET)_bench
NAME_LIST = $(TARGET)_list_bench
.PHONY: bare bench list
all: bare bench list
bare: FILES_C = main.c parsing.c linked-list.c hash.c
bare: FILES_O = $(subst .c,.o,$(FILES_C))
bench: FILES_C = benchmark/main_bench.c parsing.c benchmark/benchmark.c linked-list.c hash.c
bench: CFLAGS += $(INCLUDE_BENCH)
bench: CURRENT = _BENCH
bench: FILES_O = $(subst .c,.o,$(FILES_C))
list: FILES_C = benchmark/main_bench.c parsing.c benchmark/benchmark.c linked-list.c benchmark/hash_list.c
list: CFLAGS += -DHASHTABLE_USING_LISTS $(INCLUDE_BENCH)
list: CURRENT = _LIST
list: FILES_O = $(subst .c,.o,$(FILES_C))
clean:
-/bin/rm -f *.o benchmark/*.o $(NAME) $(NAME_BENCH) $(NAME_LIST)
%.o: %.c hash.h
gcc $(CFLAGS) -c $< -o $@
bare bench list: $$(FILES_O)
gcc $(FILES_O) -o $(NAME$(CURRENT)) $(LFLAGS)
我完全没有想法。我有很多麻烦来提出这个&#34;多目标&#34; &#34;第二次扩张&#34;版本,我不知道如何从这里继续。
请注意,可能会进行一些改进,但这是我解决后的另一个问题。
谢谢!
答案 0 :(得分:2)
您需要依赖.o
上的Makefile
个文件。这样,如果您编辑Makefile以包含-D...
,则会重新编译.o
个文件。