C++ Makefiles:转换文件扩展名

C++ Makefiles:转换文件扩展名,c++,makefile,C++,Makefile,首先,我想指出的是,我对makefiles还相当陌生,所以如果我写了一些愚蠢的东西,我很抱歉:) 我有一个变量名为SRC的makefile,它是扩展名为*.cpp的源文件列表。我使用以下指令在对象文件列表(扩展名*.o)中转换此列表: OBJ = $(SRC:%.cpp=%.o) 现在,我想以一种方式扩展makefile,使源文件列表包含*.cpp和*.cu文件。我希望对象文件列表包含所有扩展名为*.o的文件名。为了实现这一点,我使用包含*.cpp文件的SRC变量和包含*.cu文件的新SRC_

首先,我想指出的是,我对makefiles还相当陌生,所以如果我写了一些愚蠢的东西,我很抱歉:)

我有一个变量名为SRC的makefile,它是扩展名为*.cpp的源文件列表。我使用以下指令在对象文件列表(扩展名*.o)中转换此列表:

OBJ = $(SRC:%.cpp=%.o)
现在,我想以一种方式扩展makefile,使源文件列表包含*.cpp和*.cu文件。我希望对象文件列表包含所有扩展名为*.o的文件名。为了实现这一点,我使用包含*.cpp文件的SRC变量和包含*.cu文件的新SRC_cu变量,并执行以下操作:

OBJ = $(SRC:%.cpp=%.o)
OBJ += $(SRC_cu:%.cu=%.o)
这很好,但我想知道是否有一种方法可以对一条指令执行相同的操作,即使用一个带混合扩展名的SRC变量,并说“将所有扩展名为x或y的文件转换为*.o文件”。

检查此项

OBJ := $(SRC:%.cpp=%.o) 
OBJ := $(OBJ:%.cu=%.o)
它只使用一个变量SRC,其中包含.cpp和.cu文件列表

虽然这不能放在一行中,因为它使用递归变量OBJ。不要忘记使用
:=
而不仅仅是
=
,因为
OBJ
是递归使用的


由于通配符的行为不同,您不能在一行中直接传递不同的文件扩展名。尽管您可以使用最接近的解决方案,但更通用的选项是:

OBJ := $(addsuffix .o,$(basename $(SRC)))

这将从
SRC
中的文件名中删除任何类型的后缀,并将
.o
添加到每个文件名中。

OBJ=$(SRC:%.cpp=%.o)$(SRC_cu:%.cu=%.o)
?哪个
生成
?不同的<代码>使<代码>表现不同。谢谢约翰,这很有效。但也许我不够具体。我有这样的东西:SRC=a.cpp SRC+=b.cpp SRC_cu=d.cu,我只想有一个SRC,包括所有3个文件:SRC=a.cpp SRC+=b.cpp SRC+=d.cut它工作得非常好!非常感谢Sagar,这正是我想要的!非常感谢,这是一个很好的建议!它工作得很好:)