C++ 使用ar在Makefile中组合静态库

C++ 使用ar在Makefile中组合静态库,c++,c,makefile,unix-ar,C++,C,Makefile,Unix Ar,我有一堆静态库,我需要在Makefile中使用ar合并成一个文件 比如说, ar -M <<EOM CREATE app.a ADDLIB lib1.a ADDLIB lib2.a ADDLIB lib3.a .... .... .... ADDLIB libN.a SAVE END EOM 由于目标中的每个“行”或子命令都在它自己的shell中运行,因此我找不到一种方法来实现它。我假设这是一个Makefile变量,而不是bash变量。我还假设它是一个以空格分隔的文件列表。你可以这

我有一堆静态库,我需要在Makefile中使用ar合并成一个文件

比如说,

ar -M <<EOM
CREATE app.a
ADDLIB lib1.a
ADDLIB lib2.a
ADDLIB lib3.a
....
....
....
ADDLIB libN.a
SAVE
END
EOM

由于目标中的每个“行”或子命令都在它自己的shell中运行,因此我找不到一种方法来实现它。

我假设这是一个Makefile变量,而不是bash变量。我还假设它是一个以空格分隔的文件列表。你可以这样做:

#Makefile trickery to create a variable that holds a single space:
space :=
space +=

my_target:
    ar -M CREATE $(subst $(space), ADDLIB ,$(strip $(variables))
这将使用一些makefile文本处理在每个条目之间添加字符串ADDLIB,并使用CREATE手动previx第一个条目。$strip只需删除重复的空格以及尾随/前导空格,以防止任何意外的副作用

或者,如果您想做一些更复杂的事情,并且您只知道如何在bash中完成,您可以按照@MadScientist的建议,将几个菜谱行关联起来:

target:
    parmList="CREATE $$(echo "$(variables)" | sed s/ / ADDLIB /g)"; \
    ar -M $${parmList}
注意$${parmList}和$$shell…,以及后面的\和“;”前面使用了$$在第一个配方行的末尾


还有一些设置使得在单个shell中运行所有配方行,但我强烈建议不要使用它

在行的末尾使用反斜杠将多个物理行转换为一个逻辑行,发送到单个shell调用。感谢您的响应。但是,不幸的是,ar-M创建。。。ADDLIB。。。ADDLIB。。。。在一行中似乎不起作用@铁杆亨利
target:
    parmList="CREATE $$(echo "$(variables)" | sed s/ / ADDLIB /g)"; \
    ar -M $${parmList}