难以将 $ORIGIN 添加到 LDFLAGS

Difficulty adding $ORIGIN to LDFLAGS

类似于,我需要将$ORIGIN/../lib传递给我的编译程序。我通过

这样做
./configure "LDFLAGS=-Wl,-rpath,$$ORIGIN/../lib"
make

但是,当我通过 objdump -x src/foo | grep PATH 检查可执行文件时,我得到

/home/Users/me/foo_repo/lib:/../lib

当我想要的是

/home/Users/me/foo_repo/lib:$ORIGIN/../lib

所以看起来 $ORIGIN 正在被评估而不是仅仅被放入 RUNPATH

如何防止这种情况发生?我尝试向两者添加转义符 $ 但得到相同的结果。

它不起作用,因为您还需要第三层引用:因为您通过命令行将此值传递给 configure 脚本,所以您需要引用 [=45= 的值].

你运行这个:

./configure "LDFLAGS=-Wl,-rpath,$$ORIGIN/../lib"

shell 在调用 configure 之前删除了第一级引号,因此放入您的 makefile 的 LDFLAGS 的值是这样的:

LDFLAGS=-Wl,-rpath,$$ORIGIN/../lib

然后当 make 运行s 成为 linker 时,它会将转义的 $$ 转换为单个 $,并且 make 将调用 shell ] 并通过选项传递 link 行:

-Wl,-rpath,$ORIGIN/../lib

shell会扩展$ORIGIN,因为它看起来像一个shell变量,将它扩展为空字符串,得到结果-Wl,-rpath,/../lib

为了获得正确的引用,向后工作通常很有用。当 make 调用您的 link 行时,它需要转义 $ORIGIN 以便 shell 不会扩展它,因此您希望参数类似于:

'-Wl,-rpath,$ORIGIN/../lib'

为此,您需要将 LDFLAGS 设置为类似以下内容:

LDFLAGS='-Wl,-rpath,$$ORIGIN/../lib'

为了做到这一点,您需要在调用配置时从 shell 中全部转义,包括单引号,例如:

./configure "LDFLAGS='-Wl,-rpath,$$ORIGIN/../lib'"

(注意,我没试过)

我试了很多次,似乎在某些时候它仍然可以解析为空字符串,因为 Makefile 可以 运行 递归。我发现唯一可靠的方法是在我 运行 configuremake 的 shell 中另外定义 export ORIGIN='$ORIGIN',这样即使 shell 扩展 $ORIGIN 它仍然会导致值 $ORIGIN.

另请注意,您还需要 -Wl,-z,origin 才能在 运行 时间内解释值 $ORIGIN