如何使用$ ORIGIN获取RPATH来处理Code :: Blocks GCC?
-
04-07-2019 - |
题
我正在尝试将包含特殊字符串$ ORIGIN的RPATH链接到使用GCC和Code :: Blocks IDE构建的可执行文件中。我指定了
-Wl,-R$ORIGIN
在项目的链接器选项中,但命令行输出到GCC是错误的(为清晰起见而剥离):
g++ -Wl,-R
为Code :: Blocks指定此参数的正确方法是什么?
解决方案
任何决定制作令牌$ ORIGIN的人都是一个邪恶的混蛋,在程序员地狱中应该得到特殊的地位。由于'$'是bash和其他脚本语言(如make)的特殊字符,因此除非小心转义,否则它会将所有内容都搞砸。更糟糕的是,根据您正在使用的构建环境,如何正确迁移的具体细节可能会发生变化。
在bash中,你需要在$:
前加一个反斜杠-Wl,-R\$ORIGIN
Code :: Blocks显然也将$视为特殊。然后,无论子进程控制器Code :: Blocks发送命令来将反斜杠视为特殊。因此,反斜杠和$都需要加倍才能正确转义。因此,在Code :: Blocks链接器设置中,您需要指定:
-Wl,-R\\$ORIGIN
......输出:
-Wl,-R\\$ORIGIN
...到构建日志,但shell实际上已发送:
<*>......如上所述产生了预期的结果。
多么痛苦。
其他提示
除了解决代码问题的kblucks答案:块.... 对于像我这样的人偶然发现这个页面正在寻找如何使用Make来做到这一点。 诀窍是使用额外的$符号作为转义字符并用引号括起来:
-Wl,-R,'$ORIGIN/../lib'
这里可以有完整的解释: 将ORIGIN用于动态运行时图书馆搜索路径
如果您的可执行文件是由非您创建的巨大复杂脚本环境构建的,并且您不想深入研究,请尝试使用 setenv运行LD_RUN_PATH ='$ ORIGIN /../ lib' 代码>;如果这不起作用,一个实用的方法是为ld:
#!/bin/sh
exec /usr/bin/ld -R '$ORIGIN/../lib' "$@"
...然后在路径上使用该存根进行构建。在实践中,可能会调用它来构建.so文件或其他可执行文件,因此您可能需要将此作为一个更复杂的脚本来决定是否插入RPATH。或者,在没有这个的情况下运行构建,并使用和樱桃选择。
(这里的“/ usr / bin / ld”是通常运行的ld,可能在其他地方.gcc可能不会从路径中获取ld,请参阅gcc环境变量来覆盖它。里程可能变化。仅限单一使用。不保证不会比任何其他方法更糟糕。)