我正在尝试将包含特殊字符串$ 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环境变量来覆盖它。里程可能变化。仅限单一使用。不保证不会比任何其他方法更糟糕。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top