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

Makefile : select files by extension, from a variable

本文关键字:文件 扩展名 选择 变量      更新时间:2023-10-16

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

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

在 GNU make 中,有几个文本处理函数可用。你可以试试这个:

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

这会将对象列表一分为二。然后,您可以单独处理每个:

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

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

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

不过,这不太可读。

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

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

希望我能帮助:)

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

首先,您拥有哪种操作系统?

如果是 Linux 风格,那么您可以使用 | grep ext

如果它是窗口,则改用查找|。

如果您使用文件选择,

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

如果从命令行运行C++/C 程序,请选择上述程序。

如果您希望变量具有特定的扩展名,请使用正则表达式在 .(点)并仅允许 1 个分机。

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