Makefile:从变量中按扩展名选择文件

时间:2017-01-27 11:37:45

标签: c++ c makefile

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

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变量?

4 个答案:

答案 0 :(得分:5)

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

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 $< [...]

希望我帮助过:)

答案 1 :(得分:4)

使用GNU make,有几个text processing functions可用。你可以试试这个:

CSRCS = $(filter %.c,$(SRCS))
CPPSRCS = $(filter %.cpp,$(SRCS))

这将对象列表分成两部分。然后,您可以单独处理每个:

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

另一种选择是一次只应用两个过滤器:

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

但这不太可读。

答案 2 :(得分:0)

set_o_suffix=$(addsuffix .o,$(basename $1))
set_o_suffix_for_cxx=$(addsuffix .o,$(basename $(filter %.c %.cpp,$1)))

SRCS := foo.c buz/bar.cpp main.js
$(info set_o_suffix=$(call set_o_suffix,$(SRCS)))
$(info set_o_suffix_for_cxx=$(call set_o_suffix_for_cxx,$(SRCS)))
all:

输出:

set_o_suffix=foo.o buz/bar.o main.o
set_o_suffix_for_cxx=foo.o buz/bar.o

答案 3 :(得分:-3)

首先,你有什么样的操作系统?

如果是Linux风味,那么你可以使用| grep ext

如果是窗口则使用find |代替..

如果您使用文件选择,那么在构建文件选择器时,您可以填写所需的扩展名,并确保其他人将被丢弃......

如果从命令行运行C ++ / C程序,则选择上面的内容。

如果您希望变量具有特定扩展名,请使用正则表达式 指定后的字符数。 (点)并且只允许1个分机。

了解更多信息: 访问https://msdn.microsoft.com/en-us/library/bb982727.aspx