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