我正在编写一个Makefile来编译一个很长的项目。基本上,我已经定义了我需要的所有对象。当我需要生成依赖项时,问题就来了。我正在做这样的事情:
a.o: $( $(CXX) -MM $(INCLUDE) A/a.cpp | sed 's/a.o: //')
$(CXX) $(CXXFLAGS) $(INCLUDES) A/a.cpp
b.o: $( $(CXX) -MM $(INCLUDE) A/b.cpp | sed 's/b.o: //')
$(CXX) $(CXXFLAGS) $(INCLUDES) A/b.cpp
libab.a: a.o b.o
$(LXX) $(LXXFLAGS) libab.a a.o b.o
由于$(CXX) -MM $(INCLUDE) A/a.cpp | sed 's/a.o: //'
list的输出列出了a.cpp需要编译的所有依赖项,因此当我声明对象但它无法正常工作时,我试图像依赖项一样放置此命令的输出。
您有关于如何操作的想法吗?
谢谢。
为什么要尝试删除与您已经手动输入的目标前缀完全相同的目标前缀?
而是只包括整个依赖文件。
-include $(ALL_CPP_FILES:%.cpp=%.d)
自动生成.d
(依赖)文件的常用标志是:
CPPFLAGS+=-MMD # automatic .d dependency file generation
就像一样-MD
,除了它只提到用户头文件,没有提到系统头文件。
样本:
# BUILD=RELEASE
PRJNAME=demo
#
TARGETS+=bin/test
build: \
$(TARGETS) \
tags
all: build
clean:
rm -rf bin/* $(ALL_OBJ_FILES)
rm -rf $(ALL_CPP_FILES:%.cpp=%.d)
##############################
# definition
CC=gcc
CXX=g++
CPPFLAGS+=-MMD # automatic .d dependency file generation
CPPFLAGS+=-std=c++11
ifeq ($(BUILD),RELEASE)
CPPFLAGS+=-g -O3
CPPFLAGS+=-march=native
else
CPPFLAGS+=-g -O0
CPPFLAGS+=-DDEBUG -D_DEBUG
CPPFLAGS+=-DUNIT_TESTS
endif
CPPFLAGS+=-Wall -Wextra -pedantic
#CPPFLAGS+=-Werror
LDFLAGS+=-lpthread
ALL_CPP_FILES=A/a.cpp A/b.cpp
ALL_OBJ_FILES=$(patsubst %.cpp,%.o,$(ALL_CPP_FILES))
##############################
tags: $(ALL_CPP_FILES)
ctags -R A/
%.o: %.cpp
$(CXX) -c $(CPPFLAGS) $< -o $@
##############################
# tool targets
bin/test: $(ALL_OBJ_FILES)
mkdir -pv $(@D)
$(CXX) $^ $(LDFLAGS) -o $@
.PRECIOUS: S(ALL_OBJ_FILES)
.PHONY: clean all build
-include $(ALL_CPP_FILES:%.cpp=%.d)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句