【问题标题】:Makefiles: converting file extensionMakefiles:转换文件扩展名
【发布时间】:2014-10-14 08:17:55
【问题描述】:

首先我想指出,我对 makefile 还很陌生,如果我写了一些愚蠢的东西,我很抱歉 :)

我有一个变量名为 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) $(SRC_cu:%.cu=%.o) ?
  • 哪个make?不同的make 行为不同。
  • 谢谢约翰,那行得通。但也许我不够具体。我有类似的东西: SRC = a.cpp SRC += b.cpp SRC_cu = d.cu 我想要一个包含所有 3 个文件的 SRC: SRC = a.cpp SRC += b.cpp SRC += d.cu

标签: c++ makefile


【解决方案1】:

一个更通用的选项是:

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

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

【讨论】:

  • 非常感谢 MadScientist,这是一个很棒的提示!它完美地工作:)
【解决方案2】:

检查一下

OBJ := $(SRC:%.cpp=%.o) 
OBJ := $(OBJ:%.cu=%.o)

它只使用一个包含 .cpp 和 .cu 文件列表的变量 SRC。

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

由于通配符的行为,您不能直接在一行中粘贴不同的文件扩展名。虽然你可以有最接近的解决方案

【讨论】:

  • 效果很好!非常感谢 Sagar,这正是我想要的!
猜你喜欢
  • 1970-01-01
  • 2016-07-22
  • 2021-01-20
  • 2022-11-15
  • 1970-01-01
  • 2013-05-06
  • 2015-06-22
  • 2012-08-02
  • 1970-01-01
相关资源
最近更新 更多