我有一个由bakefile生成的makefile,工作正常。要运行可执行文件,它需要来自不同文件夹的库。我发现命令rpath用于指定这些库的路径。但是在使用命令时我必须将它作为参数发送到makefile。 我无法直接从bakefile中指定它。
我可以使用LDFLAGS参数,这很好。我发现here如何使用$ ORIGIN变量。
我的问题是这种逃避是如何运作的?
make LDFLAGS="-Wl,-rpath '-Wl,\$\$ORIGIN'"
单引号是否阻止make解释变量? 为什么\ $在这里两次?
答案 0 :(得分:1)
Yeesh。真是一团糟。
因此,在启动make命令之前,shell会删除第一组引号。由于外部引号集是双引号,因此您必须转义$
,否则shell会将其视为shell变量(与echo "my path is $PWD"
之类的命令进行比较以及PWD
如何变量被扩展)。 shell使用反斜杠引用$
等内容。
因此,当shell发出命令行时,它会看到设置LDFLAGS=-Wl,-rpath '-Wl,$$ORIGIN'
你的makefile中的下一个将是一个包含如下命令的配方:
$(LD) $(LDFLAGS) ...
Make会像上面那样扩展LDFLAGS
变量。对于make,任何以$
开头的名称都被视为make变量,您可以通过将$
加倍(不使用shell之类的反斜杠)并编写$$
来使其从扩展中逃脱。 。 Make会在展开期间删除一个$
。
因此,make会将LDFLAGS
缩减为字符串-Wl,-rpath '-Wl,$ORIGIN'
并将其传递给shell。
shell将剥离下一级引用,在本例中为单引号。变量不会在单引号内扩展,因此链接器实际上会获得参数,字面意思是-Wl,-rpath
和-Wl,$ORIGIN
,这就是你想要的。