难以将 $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 可以 运行 递归。我发现唯一可靠的方法是在我 运行 configure
和 make
的 shell 中另外定义 export ORIGIN='$ORIGIN'
,这样即使 shell 扩展 $ORIGIN
它仍然会导致值 $ORIGIN
.
另请注意,您还需要 -Wl,-z,origin
才能在 运行 时间内解释值 $ORIGIN
。
类似于$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 可以 运行 递归。我发现唯一可靠的方法是在我 运行 configure
和 make
的 shell 中另外定义 export ORIGIN='$ORIGIN'
,这样即使 shell 扩展 $ORIGIN
它仍然会导致值 $ORIGIN
.
另请注意,您还需要 -Wl,-z,origin
才能在 运行 时间内解释值 $ORIGIN
。