foreach重复包含在makefile中

时间:2019-07-05 13:42:26

标签: makefile

我正在尝试使用Makefile包含一些头文件。

这是我做的代码:

# Add .h and .hpp to the preprocessor build
HEADERS += $(wildcard src/*.h)
HEADERS += $(wildcard src/*.hpp)
HEADERS += $(wildcard src/**/*.h)
HEADERS += $(wildcard src/**/*.hpp)
INCLUDES = $(foreach HEADERS, $(HEADERS), -I$(dir $(HEADERS)))

# FLAGS will be passed to both the C and C++ compiler
FLAGS +=
CFLAGS +=
CXXFLAGS += $(INCLUDES)

但是一旦我构建,它就会执行:

g++  -Isrc/  -Isrc/  -Isrc/  -Isrc/misc/  -Isrc/widgets/  -Isrc/widgets/  -Isrc/widgets/  -Isrc/widgets/  -Isrc/widgets/  -Isrc/widgets/  -Isrc/widgets/  -Isrc/widgets/  -Isrc/widgets/  -Isrc/widgets/  -Isrc/widgets/ -Wsuggest-override -std=c++11  -DSLUG=NWK -fPIC -I../../include -I../../dep/include -O3 -DVERSION=0.6.4 -MMD -MP -g -march=nocona -ffast-math -fno-finite-math-only -Wall -Wextra -Wno-unused-parameter -DARCH_WIN -D_USE_MATH_DEFINES -c -o build/src/plugins/MyPlug.cpp.o src/plugins/MyPlug.cpp 

似乎每个找到的.h / .hpp都会复制HEADER标志。

您将如何解决?

1 个答案:

答案 0 :(得分:1)

一个简单的解决方案是仅通过$(sort ...)进行搜索。在制作过程中,$(sort ...)删除所有重复项:

INCLUDES = $(sort $(foreach HEADERS, $(HEADERS), -I$(dir $(HEADERS))))

一个注意事项-sort确实会更改包含目录的顺序,这反过来也会更改搜索目录的顺序,但是,您用来填充列表的方法似乎并不依赖于顺序,因此你应该很好。