GNU Make:如何连接两个字符串

10

给出以下代码行:

program_OBJS := ${program_SRCS:.cpp=.o}

我想在每个文件名后添加.o,而不是用.o替换.cpp。如何实现?
6个回答

12
这样行吗?
STRING1:="foo"
STRING2:="bar"

STRING1:=$(STRING1)$(STRING2)

显然,你可以将结果保存到一个新变量中。

2
当我打印这个结果时,我得到了"foo""bar"作为连接的结果。如何去掉不需要的引号? - Persistent Plants
foo := "bar" foo := $(patsubst "%",%,$(foo)) - Persistent Plants

10

这个在其他版本的make中也能工作,还是只有gnu make可以? - Robert S. Barnes
1
@Robert:只需要使用GNU make。如果您想要使您的Makefile保持可移植性,最好的方法是编写符合POSIX规范的Makefile。具体规范请参见此处:http://pubs.opengroup.org/onlinepubs/009695399/utilities/make.html - Jens

7

如果您想要将一些内容追加到以空格分隔的项目列表中,可以使用以下方法:

program_OBJS := $(foreach program,$(program_SRCS),$(program).o)

使用替换方法(就像在您的问题中所示):
program_OBJS := $(program_SRCS:.cpp=.cpp.o)

但是为了实现替换,列表必须包含.cpp后缀,否则替换将无法进行。


1
我曾认为$(foreach)会字面上展开第三个参数并连接结果。我刚刚测试了一下,如果省略了空格,它会自动添加一个空格,因此不是必需的。(我将从我的答案中删除该注释并更新自己的Makefile... ;) ) - Veger

7

更简洁的替代方法,使用模式替换:program_OBJS := ${program_SRCS:%=%.o}


3

另一种不考虑扩展名的工作方式:${program_SRCS:=.o}


1

仅供猜测 program_OBJS := ${program_SRCS:.cpp=.cpp.o}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接