我最近花了 5 个小时来弄清楚如何编写我需要的 makefile。我不是信息学家或程序员,所以我想对我设法做的事情发表一些评论。我已经在不同的网站上看了很多,但仍然......
我需要一个创建不同可执行文件的 makefile:prog1
、prog2
...
要创建 .o
文件,因为我有很多具有很多依赖关系的文件,所以我不想全部指定它们。所以我想/需要使用带有模式规则的自动变量。为了加快编译速度,我还注意只重新编译修改过的文件。我通过使用 -MD
标志实现了这一点,该标志创建了一个保存在 $(BUILD)
目录中的 .d
文件。
我仍然不能做的是自动检测.o
文件prog1
需要。所以现在我必须自动指定它们...如果您知道如何自动执行...
我还想将 .o
文件保存在 $(BUILD)
目录中,但我不能让它工作。
欢迎任何建议! 谢谢
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)/*
最佳答案
您无法让 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。
关于具有多个程序的c++ makefile,源文件的自动检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22165625/