由于"预处理器定义"而重新编译在.h

时间:2014-10-22 20:27:40

标签: c linux makefile dependencies

我的问题

我用一个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;版本,我不知道如何从这里继续。

请注意,可能会进行一些改进,但这是我解决后的另一个问题。

谢谢!

1 个答案:

答案 0 :(得分:2)

您需要依赖.o上的Makefile个文件。这样,如果您编辑Makefile以包含-D...,则会重新编译.o个文件。