c++ - 使用 ar 在 Makefile 中组合静态库
问题描述
我有一堆静态库,我需要使用ar
in组合成一个文件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
我找不到办法做到这一点,因为目标内的每个“行”或子命令都在它自己的外壳中运行。
解决方案
我假设这是一个 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 中运行所有配方行,但我强烈建议不要使用它)
推荐阅读
- java - 如何处理 List IndexOutOfBoundsException?
- objective-c - 在目标 c 中编码 URL 参数
- ios - 在 Xcode 11 中为旧源代码启用自动布局
- javascript - 我可以在没有服务器的情况下执行此操作吗?
- java - 返回“”是什么意思?
- jquery - 从使用 jQuery 发出 GET 请求的函数返回数组
- java - 用于将日志/记录重定向到远程服务器的 Java 命令行选项
- python-3.x - Image Magick 命令的等效 OpenCV 代码
- asp.net - Visual Basic - 如何为下拉列表中的 SelectedIndex 项分配值?
- javascript - 在 vuejs 中调用嵌套方法