Wil*_*agh 15 c c++ dependencies makefile gnu-make
这是我目前的makefile.
CXX = g++
CXXFLAGS = -Wall -O3
LDFLAGS =
TARGET = testcpp
SRCS = main.cpp object.cpp foo.cpp
OBJS = $(SRCS:.cpp=.o)
DEPS = $(SRCS:.cpp=.d)
.PHONY: clean all
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) -o $(TARGET)
.cpp.o:
$(CXX) $(CXXFLAGS) -c $< -o $@
%.d: %.cpp
$(CXX) -M $(CXXFLAGS) $< > $@
clean:
rm -f $(OBJS) $(DEPS) $(TARGET)
-include $(DEPS)
Run Code Online (Sandbox Code Playgroud)
它有一个例外,完美地工作.如果目录已经是干净的(没有*.d,*.o)并且我运行'make clean',它会重新创建依赖项,然后立即删除它们:
[user@server proj]$ make
g++ -M -Wall -O3 foo.cpp > foo.d
g++ -M -Wall -O3 object.cpp > object.d
g++ -M -Wall -O3 main.cpp > main.d
g++ -Wall -O3 -c main.cpp -o main.o
g++ -Wall -O3 -c object.cpp -o object.o
g++ -Wall -O3 -c foo.cpp -o foo.o
g++ -Wall -O3 main.o object.o foo.o -o testcpp
[user@server proj]$ make clean
rm -f main.o object.o foo.o main.d object.d foo.d testcpp
[user@server proj]$ make clean
g++ -M -Wall -O3 foo.cpp > foo.d
g++ -M -Wall -O3 object.cpp > object.d
g++ -M -Wall -O3 main.cpp > main.d
rm -f main.o object.o foo.o main.d object.d foo.d testcpp
[user@server proj]$
Run Code Online (Sandbox Code Playgroud)
我不明白为什么第二个'make clean'会重新生成依赖文件.我怎么能避免这个?对于这个人为的例子来说,这不是什么大问题,但对于一个大型项目来说,这可能非常耗时.
谢谢.
Jac*_*lly 23
这是因为.d文件是-include无条件的.据make了解,他们可以向clean目标添加依赖项或命令.include出于这个原因,首先构建所有d文件,否则可能会出现错误或失败的构建.要禁用此功能,您需要有条件地包含依赖项文件:
ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是使用生成依赖文件,touch并将它们替换为实际数据作为编译的副作用.这就是automake进行依赖关系跟踪的方式,因为它可以使一次性构建更快.如果你想走这条路,请查看-MD和-MMD选项gcc.使用模式规则,如:
%.d:
@touch $@
Run Code Online (Sandbox Code Playgroud)
最初创建依赖项文件.
如果要跳过多个目标的包含,则可以使用该filter功能。
MAKEFILE_TARGETS_WITHOUT_INCLUDE := clean distclean doc
# Include only if the goal needs it
ifeq ($(filter $(MAKECMDGOALS),$(MAKEFILE_TARGETS_WITHOUT_INCLUDE)),)
-include $(DEPS)
endif
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3597 次 |
| 最近记录: |