是否可以从与特定扩展名匹配的变量中选择文件,然后丢弃其余文件?

SRCS = file1.c file2.c file3.cpp

OBJS = $(SRCS:%.c=%.o)
OBJS += $(SRCS:%.cpp=%.o)

这样做的问题是$(SRCS:%.c=%.o)将.c文件转换为.o文件,即,但保留了.cpp文件。

在这种情况下,OBJS变量将等于
file1.o file2.o file3.cpp file1.c file2.c file3.o

我想要的是
file1.o file2.o file3.o

那么,有可能吗?还是唯一干净的方法是拥有SRCS_CSRCS_CPP变量?

最佳答案

我看到了两种可能的解决方法(但它们会给您带来一些不同
项目组织)。首先是拥有:

SRCS := file1 file2 file3
OBJS := $(SRCS:%=%.o)

然后,您可以使用相关性定义目标以检查
源文件是C或C++文件:
%.o: %.cpp
    g++ $< [...]

%.o: %.c
    gcc $< [...]

或者,您可以拥有file1.c.o/file3.cpp.o之类的目标文件。那意味着
您可以使用同名的C和C++文件,这可能会很有用。
然后,您只需要做:
SRCS := file1.c file2.c file3.cpp
OBJS := $(SRCS:%=%.o)

%.cpp.o: %.cpp
    g++ $< [...]

%.c.o: %.c
    gcc $< [...]

希望我能帮到:)

10-04 21:16