Gnu Makefile - 处理依赖项

Hap*_*cky 12 c++ unix gnu makefile sed

Unix平台上的C++程序员使用什么方法来创建和管理Makefile?

我在我的项目中使用手工制作的Makefile,但它们不处理头文件更改和其他依赖项.我google了一下,在这里找到了一个很好的解决方案.

但是我在sed命令中遇到了一个问题 -

    sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
        -e '/^$$/ d' -e 's/$$/ :/' < $*.d >> $*.P; \
Run Code Online (Sandbox Code Playgroud)

问题在于第3个表达式"-e's/*\$$ //".它不起作用.它应该删除尾随反斜杠.我知道那里必须有双倍的美元,因为这是一个Makefile.有人能告诉我这里有什么问题吗?

这是完整的Makefile -

CC=g++
CFLAGS=-g -Wall
LIBS=-lpthread

OBJS=file1.o file2.o
TARGET=testProg

$(TARGET) : $(OBJS)
        $(CC) -o $@ $^ $(CFLAGS) $(LIBS)

%.o : %.cpp
        $(CC) -MMD -c -o $@ $< $(CFLAGS)
        @cp $*.d $*.P; \
            sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
                -e '/^$$/ d' -e 's/$$/ :/' < $*.d >> $*.P; \
            rm -f $*.d

-include $(OBJS:%.o=%.P)

clean :
        rm -f $(TARGET) $(OBJS)

all : $(TARGET)
Run Code Online (Sandbox Code Playgroud)

除了解决这个问题之外,我还想了解第一个问题的一些提示/指示.

Joh*_*ter 25

gcc/g ++可以通过-M选项系列为您生成依赖项.以下通过指定如何在.depends给定源文件的情况下生成文件来工作.通过执行-include $(DEPS)$(DEPS)被识别为目标,并且将在源文件更改时构建/重建.

CXX      = g++
CXXFLAGS = -Wall -O3
LDFLAGS  =

TARGET = testcpp
SRCS   = main.cc x.cc foo.cc
OBJS   = $(SRCS:.cc=.o)
DEPS   = $(SRCS:.cc=.depends)


.PHONY: clean all

all: $(TARGET)

$(TARGET): $(OBJS)
        $(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) -o $(TARGET)

.cc.o:
        $(CXX) $(CXXFLAGS) -c $< -o $@

%.depends: %.cc
        $(CXX) -M $(CXXFLAGS) $< > $@

clean:
        rm -f $(OBJS) $(DEPS) $(TARGET)

-include $(DEPS)
Run Code Online (Sandbox Code Playgroud)


Bet*_*eta 8

  1. 我也使用这种方法,不能高度赞扬它.我手工编写makefile并在新项目中重复使用它们.
  2. .表达式"s/*\\ $ //"将在Make的上下文之外工作.在makefile中它不起作用,因为Make在将结果传递给shell之前尝试解释"$ /".所以你必须在makefile中使用"s/*\\ $$ //"(注意额外的$),但这不会 Make的上下文之外工作(所以测试它是一个轻微的痛苦).



编辑:

我已经尝试了你的makefile,而sed语句似乎删除尾随反斜杠就好了.尝试更简单的东西,比如:

backslash:
    @echo " \\" > $@

test: backslash
    @echo without sed:
    @cat backslash
    @echo with sed:
    @sed -e 's/ *\\$$//' < backslash



编辑: 好的,现在我迷上了.你能试试这些实验并告诉我们结果吗?

Change the last character to 'z'      :  s/.$/z/
Change a trailing backslash to 'z'    :  s/\\$/z/
Change a trailing backslash to 'z'    :  sm\\$mzm
Delete a trailing backslash           :  s/\\$//
Delete spaces and a trailing backslash:  s/ *\\$//
Try all of these inside and outside of Make, with '$' and '$$'.

  • 请改用GCC的标头依赖性发生器开关.Visual Studio也有一个.这样你只依赖于实际包含的标题. (3认同)