Command line 如何让带有$ORIGIN的RPATH处理代码::块GCC?

Command line 如何让带有$ORIGIN的RPATH处理代码::块GCC?,command-line,gcc,linker,codeblocks,rpath,Command Line,Gcc,Linker,Codeblocks,Rpath,我试图将包含特殊字符串$ORIGIN的RPATH链接到使用GCC和Code::Blocks IDE构建的可执行文件中。我已经详细说明了 -Wl,-R$ORIGIN 在项目的链接器选项中,但到GCC的命令行输出是错误的(为了清楚起见,已删除): 为Code::Blocks指定此参数的正确方法是什么?任何决定制作标记$ORIGIN的人都是一个邪恶的混蛋,应该在程序员地狱中占有特殊位置。由于“$”是bash和其他脚本语言(如make)的特殊字符,除非小心转义,否则它会把一切都搞糟。更糟糕的是,根据您

我试图将包含特殊字符串$ORIGIN的RPATH链接到使用GCC和Code::Blocks IDE构建的可执行文件中。我已经详细说明了

-Wl,-R$ORIGIN
在项目的链接器选项中,但到GCC的命令行输出是错误的(为了清楚起见,已删除):


为Code::Blocks指定此参数的正确方法是什么?

任何决定制作标记$ORIGIN的人都是一个邪恶的混蛋,应该在程序员地狱中占有特殊位置。由于“$”是bash和其他脚本语言(如make)的特殊字符,除非小心转义,否则它会把一切都搞糟。更糟糕的是,根据您正在使用的构建环境,如何正确转义的细节可能会发生变化

在bash中,需要在$前面加一个反斜杠:

-Wl,-R\$ORIGIN
Blocks显然也将$视为特殊的。然后,无论哪个子流程控制器代码::Blocks向发送命令,都会将反斜杠视为特殊的。因此,反斜杠和美元都需要加倍才能正确转义。因此,在Code::Blocks链接器设置中,需要指定:

-Wl,-R\\$$ORIGIN
…其输出:

-Wl,-R\\$ORIGIN
…发送到生成日志,但实际会发送shell:

-Wl,-R\$ORIGIN
…如上所述,产生预期结果


多痛苦啊。

除了kblucks之外,还有一个解决代码问题的答案:块。。。。 对于那些像我一样偶然发现这一页,寻找如何使用Make实现这一点的人。 诀窍是使用额外的$符号作为转义字符,并用引号将其括起来:

-Wl,-R,'$$ORIGIN/../lib'
详细解释如下:

如果您的可执行文件是由一个庞大而复杂的脚本环境构建的,而不是由您创建的,并且您不想对此进行深入研究,请尝试使用
setenv LD_RUN_PATH='$ORIGIN/./lib'
;如果这不起作用,一种实用的方法是为ld创建一个包装器:

#!/bin/sh
exec /usr/bin/ld -R '$ORIGIN/../lib' "$@"
。。。然后使用路径上的存根进行构建。实际上,可能会调用它来生成.so文件或其他可执行文件,因此您可能需要将其设置为一个更复杂的脚本,以决定是否插入RPATH。或者,运行build时不使用这个,使用,和cherry pick


(此处“/usr/bin/ld”是通常会运行的ld,可能在其他地方。gcc可能不会从路径中拾取ld,请参阅gcc环境变量以覆盖该路径。里程数可能会有所不同。仅限一次性使用。不保证比任何其他方法更糟糕)。

+1仅针对邪恶的私生子评论。。。这个问题让我痛苦万分。完美的评论,他应该在地狱里腐烂。。有40个女妖在探测他,哈哈。有没有一种方法,给定一个构建的可执行文件,来改变它的RPATH?因为这只是ELF表中的一个字符串,所以它似乎并不不合理。在我看来,将rpath设置为$ORIGIN/yada/yada似乎是您想要添加到某些现有(可能非常复杂)构建脚本中的东西,如果它们提供了一种将选项发送到链接器的方法,那就太好了,但是,正如前面所讨论的,您必须处理逃出地狱(可能更容易制作自己的“ld”包装器将其隐藏)。OTOH在烟雾消散后修改结果上的RPATH?没那么难。如果,也就是说,有一个实用程序可以做到这一点…导出ORIGIN='$ORIGIN'并用火救火?我必须在链接器设置中编写
-Wl,-R\\$$$ORIGIN
,使其在构建日志中输出
-Wl,-R\\\$ORIGIN
,并正常工作。与code::Blocks相关,但未指定:
#!/bin/sh
exec /usr/bin/ld -R '$ORIGIN/../lib' "$@"