如何在Mafile中对* F使用过滤器?

问题描述 投票:0回答:1

我的Makefile中有一行:

$(CC) $(CFLAGS) -o $@ -c $(filter %$(*F).cpp, $(SOURCES))

[假设我有2个cpp文件,例如“ docinfo.cpp”和“ info.cpp”,当g ++将“ docinfo.cpp”构建为“ docinfo.o”时,它可以工作。

g++ -I ... -o docinfo.o -c docinfo.cpp

但是当g ++将“ info.cpp”构建为“ info.o”时,会出现错误。

g++ -I ... -o info.o -c docinfo.cpp info.cpp

我如何使其工作。

这是我的Makefile:

CC        := gcc
RM        := rm -rf

WORKSPACE := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))

TARGET    := $(WORKSPACE)test.so

SOURCES   := $(foreach dir,$(WORKSPACE),$(wildcard $(dir)source/*.c))

INCLUDE   := -I$(WORKSPACE)include/

CFLAGS    := $(INCLUDE) -O0 -Wall -fPIC 
#CFLAGS    += -g
#CFLAGS    += -D__DEBUG__

OBJS      := $(notdir $(SOURCES:.c=.o))
OBJ_PATH  := $(WORKSPACE)object/
OBJS_O    := $(addprefix $(OBJ_PATH), $(OBJS))

LIB_PATH  := $(WORKSPACE)lib
LIBS      := -ldl -shared

.PHONY: all clean

all: $(OBJ_PATH) $(LIB_TAG) $(TARGET)

$(OBJ_PATH):
    mkdir -p $@

$(TARGET): $(OBJS_O)
    $(CC) $(CFLAGS) -o $@ $^ -L$(LIB_PATH) $(LIBS)
    @echo "$@"

$(OBJS_O): $(SOURCES)
    $(CC) $(CFLAGS) -o $@ -c $(filter %$(*F).c,$(SOURCES))

clean:
    -$(RM) $(OBJS_O) $(OBJ_PATH) $(TARGET)
c makefile
1个回答
0
投票

首先,为什么不只使用$<而不是尝试从$(SOURCES)中过滤掉某些内容?

$(CC) $(CFLAGS) -o $@ -c $<

[如果出于某种奇怪的原因,您确实需要过滤器,那么如果您不希望为以$(* F).cpp结尾的任何值返回匹配项,那么就不要在其前面加上模式匹配项字符(%):

$(CC) $(CFLAGS) -o $@ -c $(filter $(*F).cpp, $(SOURCES))

但是,这很奇怪,因为$(*F)应该扩展为foo.cpp,这意味着它将解析为foo.cpp.cpp

所以,我认为您的makefile有点不寻常(或可能不正确)……但是由于您仅提供了配方,没有向我们展示整个规则,所以我们无法确定。

© www.soinside.com 2019 - 2024. All rights reserved.