【问题标题】:Generating dependencies for gcc为 gcc 生成依赖项
【发布时间】:2014-02-21 08:39:18
【问题描述】:

我正在编写一个 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 需要编译的所有依赖项,因此我在声明对象时尝试将此命令的输出与依赖项类似,但它不起作用。

你知道怎么做吗?

谢谢。

【问题讨论】:

    标签: gcc makefile dependencies


    【解决方案1】:

    您为什么要删除您已经手动输入的目标前缀?

    而只是包含整个依赖文件。

    -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)
    

    【讨论】:

      猜你喜欢
      • 2021-01-12
      • 1970-01-01
      • 2010-09-10
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      相关资源
      最近更新 更多