生成文件 :从变量中按扩展名选择文件
Makefile : select files by extension, from a variable
是否可以从变量中选择与特定扩展名匹配的文件,并丢弃其余文件?
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
变量?
在 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
相关文章:
- 如何按文件扩展名引用文件夹中的文件
- 谁能告诉我,程序中的错误是什么?该程序仅用于获取文件扩展名
- 通过cMake使用具有自定义文件扩展名的共享库
- 在另一个字符串中插入文件扩展名之前的字符串
- 如何在不使用文件扩展名的情况下使用命令行参数打开C++中的文本文件?
- Eclipse CDT:传递具有相同文件扩展名的多个程序参数
- 将C 代码桥接到我的Swift代码中.哪些文件扩展名为XCode中的基于C的语言
- 如何打开并显示C 中任何文件扩展名的文件
- 循环浏览所有项目,其中QTREEVIEW QFILESYSTEMMODEL上具有所需的文件扩展名
- 如何调用 ShellExecute 以使用 C++ 打开具有特定程序的文件,而无需关联相同的文件扩展名
- 用户定义的C 文件扩展名,用于G 汇编
- 如何在 INFLATE 后获取原始文件扩展名
- CMake:如何仅将特定文件扩展名从一个目录复制到另一个目录
- 获取文件扩展名
- 共享库的TX文件扩展名
- 如何创建一个不敏感的正则态度以匹配文件扩展名
- 如何更改QT上的文件扩展名
- 列出 OpenCV 支持的文件扩展名
- 如何避免 CFile查找文件扩展名超过三个字符的误报
- C++模板实现文件扩展名约定