首页 > 解决方案 > 使用 ar 在 Makefile 中组合静态库

问题描述

我有一堆静态库,我需要使用arin组合成一个文件Makefile

例如,

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

这很好,只要我知道我需要添加为ADDLIB libX.a. 我想自动化这个。我在 Makefile 中有一个变量来存储所有这些库。在 Makefile 目标内部,我想做,

my_target:
    # Get all libraries from the variable $(libraries).
    # Combine all of them into a single file using archiver as above

我找不到办法做到这一点,因为目标内的每个“行”或子命令都在它自己的外壳中运行。

标签: c++cmakefileunix-ar

解决方案


我假设这是一个 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.$(strip)简单地删除重复的空格(以及尾随/前导空格)以防止任何意外的副作用。

或者,如果您想做一些更复杂的事情,并且您只知道如何在 bash 中完成,您可以按照@MadScientist 的建议进行操作,并将几个配方行放在一起:

target:
    parmList="CREATE $$(echo "$(variables)" | sed s/ / ADDLIB /g)"; \
    ar -M $${parmList}

注意 and 前面的使用,$$以及结尾的and ';' 在第一个配方行的末尾。 $${parmList}$$(shell ...)\

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


推荐阅读