我的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)
首先,为什么不只使用$<
而不是尝试从$(SOURCES)中过滤掉某些内容?
$(CC) $(CFLAGS) -o $@ -c $<
[如果出于某种奇怪的原因,您确实需要过滤器,那么如果您不希望为以$(* F).cpp结尾的任何值返回匹配项,那么就不要在其前面加上模式匹配项字符(%
):
$(CC) $(CFLAGS) -o $@ -c $(filter $(*F).cpp, $(SOURCES))
但是,这很奇怪,因为$(*F)
应该扩展为foo.cpp
,这意味着它将解析为foo.cpp.cpp
。
所以,我认为您的makefile有点不寻常(或可能不正确)……但是由于您仅提供了配方,没有向我们展示整个规则,所以我们无法确定。