假设您在makefile片段中有一个变量,如下所示:
MY_LIST=a b c d
Run Code Online (Sandbox Code Playgroud)
然后,我如何反转该列表的顺序?我需要:
$(warning MY_LIST=${MY_LIST})
Run Code Online (Sandbox Code Playgroud)
显示
MY_LIST=d c b a
Run Code Online (Sandbox Code Playgroud)
编辑:真正的问题是
ld -r some_object.o ${MY_LIST}
Run Code Online (Sandbox Code Playgroud)
生成a.out带有未定义符号的符号,因为其中的项目MY_LIST实际上是归档,但顺序错误.如果顺序MY_LIST颠倒,它将正确链接(我认为).如果您知道一种更明智的方式来获得正确的链接,请告诉我.
小智 19
纯GNU的解决方案:
默认:全部
foo =请逆转我
reverse = $(如果$(1),$(反向调用,$(wordlist 2,$(单词$(1)),$(1))))$(firstword $(1))
all:@echo $(call reverse,$(foo))
得到:
$ make
我反过来请
对 GNU make 解决方案的改进:
reverse = $(if $(wordlist 2,2,$(1)),$(call reverse,$(wordlist 2,$(words $(1)),$(1))) $(firstword $(1) ),$(1))
小智 5
您还可以使用 ld 定义搜索组:
ld -r foo.o -( a.a b.a c.a -)
Run Code Online (Sandbox Code Playgroud)
将迭代 aa、ba 和 ca,直到组中的任何对象都无法满足新的未解析符号。
如果您使用 gnu ld,您还可以执行以下操作:
ld -r -o foo.o --whole-archive bar.a
Run Code Online (Sandbox Code Playgroud)
后者稍强一些,因为它将包含 bar.a 中的每个对象,无论它是否满足 foo.o 中未解析的符号。