我最近失去了5个小时来弄清楚如何编写我需要的makefile。我不是一个信息学家或程序员,所以我想对我的工作做一些评论。我已经在不同的网站上看了很多但仍然......
我需要一个创建不同可执行文件的makefile:prog1
,prog2
...
要创建.o
文件,因为我有许多具有许多依赖项的文件,我不想全部指定它们。所以我想/需要使用带有模式规则的自动变量。为了加快编译速度,我还要注意只重新编译修改过的文件。我通过使用-MD
标志来实现此目的,该标志创建了.d
目录中保存的$(BUILD)
文件。
我仍然无法自动检测哪些.o
文件prog1
需要。所以现在我必须自动指定它们......如果你知道如何自动指定它们......
我还想将.o
文件保存在$(BUILD)
目录中,但我无法使其正常工作。
欢迎任何建议! THX
CXX = g++
ERRORS = -Wall -Wextra -pedantic
LAPACK = -llapack -lblas
OPTION = -O3 -fopenmp
CXXFLAGS = $(LAPACK) $(ERRORS) $(OPTION)
LDFLAGS = $(LAPACK) $(ERRORS) $(OPTION)
BUILD=build
SRCS=(wildcard *.cpp)
all:prog1 prog2 ...
prog1:prog1.o dep_only_for_prog_1.o dep_for_all_progs.o dep_for_some_progs.o
$(CXX) -o $@ $^ $(LDFLAGS) $(NOASSERT)
prog2:prog2.o dep_only_for_prog_2.o dep_for_all_progs.o dep_for_some_progs.o
$(CXX) -o $@ $^ $(LDFLAGS) $(NOASSERT)
...
%.o:%.cpp
$(CXX) -MD -c $(CXXFLAGS) $(NOASSERT) $< -o $@
mv $(<:.cpp=.d) $(BUILD)
-include $(addprefix $(BUILD)/$(SRCS:.cpp=.d))
clean:
rm -f *.o $(BUILD)/*
答案 0 :(得分:1)
你无法得到make来推断哪些文件属于哪些程序,但是你可以使你的makefile更易于阅读和更新。此外,您还有一些不好的事情,例如将$(LAPACK)
(包含链接器标志)添加到$(CXXFLAGS)
(传递给编译器)。
尝试:
PROGRAMS = prog1 prog2
prog1_SOURCES = prog1.cpp dep_only_for_prog_1.cpp \
dep_for_all_progs.cpp dep_for_some_progs.cpp
prog2_SOURCES = prog2.cpp dep_only_for_prog_2.cpp \
dep_for_all_progs.cpp dep_for_some_progs.cpp
#----- Don't need to change below here
CXX = g++
ERRORS = -Wall -Wextra -pedantic
LAPACK = -llapack -lblas
OPTION = -O3 -fopenmp
CXXFLAGS = $(ERRORS) $(OPTION)
LDFLAGS = $(LAPACK) $(ERRORS) $(OPTION)
BUILD=build
SRCS := $(wildcard *.cpp)
all: $(PROGRAMS)
.SECONDEXPANSION:
$(PROGRAMS): $$($$@_SOURCES:%.cpp=%.o)
$(CXX) -o $@ $^ $(LDFLAGS) $(NOASSERT)
%.o : %.cpp
$(CXX) -MD -c $(CXXFLAGS) $(NOASSERT) $< -o $@
mv $(<:.cpp=.d) $(BUILD)
-include $(addprefix $(BUILD)/$(SRCS:.cpp=.d))
clean:
rm -f *.o $(BUILD)/*
或者你可以根据需要使用eval。