Makefile中的简单字符串替换

And*_*Dog 3 makefile gnu-make substitution

我想libswscale.so.2libswscale.so(变量分别调用$(SLIBNAME_WITH_MAJOR)和变量$(SLIBNAME))替换字符串.这是我在Makefile中尝试过的:

$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS) $(SUBDIR)lib$(NAME).ver
    [...]
    @echo SHFLAGS=$(SHFLAGS)
    @echo SLIBNAME_WITH_MAJOR=$(SLIBNAME_WITH_MAJOR)
    @echo SLIBNAME=$(SLIBNAME)
    @echo A $(patsubst $(SLIBNAME_WITH_MAJOR),$(SLIBNAME),$(SHFLAGS))
    @echo B $(SHFLAGS:$(SLIBNAME_WITH_MAJOR)=$(SLIBNAME))
    @echo C $($(SHFLAGS):$(SLIBNAME_WITH_MAJOR)=$(SLIBNAME))
    @echo D $(SHFLAGS:$(SLIBNAME_WITH_MAJOR)=$(SLIBNAME))
    @echo E $(subst $(SLIBNAME_WITH_MAJOR),$(SLIBNAME),$(SHFLAGS))
    @echo F $(subst l,L,$(SHFLAGS))
Run Code Online (Sandbox Code Playgroud)

输出是

SHFLAGS=-shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
SLIBNAME_WITH_MAJOR=libswscale.so.2
SLIBNAME=libswscale.so
A -shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
B -shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
C
D -shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
E -shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
F -shared -WL,-soname,libswscale.so.2 -WL,-BsymboLic -WL,--version-script,LibswscaLe/LibswscaLe.ver
Run Code Online (Sandbox Code Playgroud)

最后一个(F)特别荒谬.这有什么不对?是因为它$(SHFLAGS)也是由变量组成的吗?

And*_*Dog 6

找到它:$(SHFLAGS)被定义为

SHFLAGS=-shared -Wl,-soname,$$(@F) blablafoo
Run Code Online (Sandbox Code Playgroud)

并且在$$(@F)实际评估之前使用任何替换都是行不通的(在我的情况下libswscale.so.2).

我通过替换变量引用解决了它:

@echo $(subst $$(@F),$(SLIBNAME),$(SHFLAGS))
Run Code Online (Sandbox Code Playgroud)

赋值的小提示:VAR = $(OTHERVAR)在使用时VAR := $(OTHERVAR)进行评估,立即进行评估.