问题描述
我的makefile从MongoDatabase
和.a
单个文件创建了许多.so
和.c
格式的小型库。例如,如果.cxx
包含SmallLibSrc
,我希望foo.c
包含SmallLibs
。同样,如果libfoo.a libfoo.so
包含SmallLibSrc
,我希望bar.cxx
包含SmallLibs
。
我可以通过使用虚拟变量(例如:
)来使此操作分两步进行:libbar.a libbar.so
但是由于某种原因,在一个变量中执行失败。我想我对这些替换的语法不了解。还有另一种行之有效的方法吗?请注意,我部分要求的是更简洁的解决方案,但主要是为了了解有关$()的更多信息。
SmallLibsDummyA = $(SmallLibSrc:%.c=lib%.a)
SmallLibsDummySO = $(SmallLibSrc:%.c=lib%.so)
SmallLibs = $(SmallLibsDummyA:%.cxx=lib%.a) $(SmallLibsDummySO:%.cxx=lib%.so)
解决方法
这行不通:
SmallLibSrc = foo.cxx bar.c
$($(SmallLibSrc:%.cxx=lib%.a):%.c=lib%.a)
因为替换变量的格式为$(NAME:...)
,其中NAME
是变量 name 。在您的示例中,首先扩展内部变量,然后得到:
SmallLibSrc = foo.cxx bar.c
$(libfoo.a bar.c:%.c=lib%.a)
它将尝试扩展名为libfoo.a bar.c
的make 变量,该变量显然不存在。
您不能使用此表格;您将必须使用更通用的功能,例如:
$(foreach base,$(basename $(SmallLibSrc)),lib$(base).a lib$(base).so)