1

我有一个由 bakefile 生成的生成文件,它工作正常。要运行可执行文件,它需要来自不同文件夹的库。我找到了用于指定这些库路径的命令 rpath。但是我必须在使用命令时将它作为参数发送到makefile。我不能直接从烘焙文件中指定它。

我可以使用 LDFLAGS 参数,这很好。我在这里找到了如何使用 $ORIGIN 变量。

我的问题是这种转义是如何工作的?

make LDFLAGS="-Wl,-rpath '-Wl,\$\$ORIGIN'"

是单引号来防止 make 解释变量吗?为什么 \$ 在这里两次?

4

1 回答 1

2

是的。真是一团糟。

因此,shell 在启动 make 命令之前会删除第一组引号。由于外部引号是双引号,因此您必须转义,$否则 shell 会将其视为 shell 变量(与类似命令echo "my path is $PWD"以及PWD变量的扩展方式进行比较)。shell 使用反斜杠来引用诸如$.

因此,当 shell 将命令行交给 make 时,它​​会看到设置LDFLAGS=-Wl,-rpath '-Wl,$$ORIGIN'

你的 makefile 中的下一个将是一个带有如下命令的配方:

$(LD) $(LDFLAGS) ...

Make 将LDFLAGS如上扩展变量。对于 make,任何以 a 开头的名称$都被认为是一个 make 变量,你可以通过加倍$(不使用 shell 之类的反斜杠)并编写$$. Make 将$在扩展期间删除一个。

因此,make 将简化LDFLAGS为字符串-Wl,-rpath '-Wl,$ORIGIN'并将其传递给 shell。

shell 将去掉下一级的引用,在这种情况下是单引号。变量不会在单引号内展开,因此链接器实际上从字面上获取参数-Wl,-rpath-Wl,$ORIGIN,这就是您想要的。

于 2016-11-17T19:37:12.450 回答