为gcc生成依赖关系

4

我正在编写一个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: //'的输出列出了a.cpp需要编译的所有依赖项,因此我试图将此命令的输出用作声明对象时的依赖项,但它不起作用。
您有什么想法吗?
谢谢。
1个回答

4
你为什么要删除目标前缀,这正是你已经手动输入的内容?相反,应该包含整个依赖文件。
-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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接