是否可以从与特定扩展名匹配的变量中选择文件,并丢弃其余的文件?
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_C
和SRCS_CPP
变量?
答案 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