能否将client_win自身纳入Makefile的$(addprefix)函数调用中?
当然可以!而且有更简洁的实现方式
你完全可以把client_win本身融入$(addprefix)的调用里,根本不需要用NOTHING这种占位符——直接用空字符串作为$(addprefix)第二个参数的第一个元素就行。
具体写法
把原来的:
$(addsuffix .exe,client_win $(addprefix client_win, _throttle _freq ))
改成:
$(addsuffix .exe, $(addprefix client_win, '' _throttle _freq))
原理说明
$(addprefix PREFIX, WORDS)函数的作用是给WORDS列表里的每个单词都加上PREFIX前缀:
- 当
WORDS里第一个元素是空字符串('')时,client_win+ 空字符串就得到client_win,正好是你要的基础目标; - 后面的
_throttle和_freq加上前缀后,就变成client_win_throttle和client_win_freq,完美覆盖所有三个需要的目标。
另一种更直观的写法(可选)
如果你觉得写''有点别扭,可以先定义一个空变量:
empty := TARGETS := $(addsuffix .exe, $(addprefix client_win, $(empty) _throttle _freq))
展开后的结果和上面完全一致,都是client_win.exe client_win_throttle.exe client_win_freq.exe。
额外小提示
其实如果你是在Makefile的shell命令中(比如echo或者编译命令里),也可以直接用Bash的大括号扩展,和你平时在终端里写的一样:
print_targets: @echo client_win{,_throttle,_freq}.exe
但如果是用来定义Make的编译目标列表,用Make自带的函数会更符合Makefile的语法规范,也能避免依赖shell的特性。
内容的提问来源于stack exchange,提问作者user8243991
相关产品推荐
相关产品推荐

