Gcc RPATH必须在编译时存在

Gcc RPATH必须在编译时存在,gcc,linker,ld,rpath,Gcc,Linker,Ld,Rpath,如果我遗漏了一些明显的东西,请原谅。我正在为另一个平台开发一些应用程序,我所有的专有库都安装到/app/lib。为了便于实现这一点,我将每个二进制文件的运行时库路径指定为“/app/lib”。这很好用;但是,它要求链接时在我的生成环境中存在路径“/app/lib”(即使该目录为空)。我使用的是NetBeans,这可能会使事情复杂化,但我可以看到“-Wl,-rpath/app/lib”被传递给gcc 我希望避免在构建环境中创建空的“/app/lib”,但我不想更改目标平台上的文件结构。如果从生成环

如果我遗漏了一些明显的东西,请原谅。我正在为另一个平台开发一些应用程序,我所有的专有库都安装到/app/lib。为了便于实现这一点,我将每个二进制文件的运行时库路径指定为“/app/lib”。这很好用;但是,它要求链接时在我的生成环境中存在路径“/app/lib”(即使该目录为空)。我使用的是NetBeans,这可能会使事情复杂化,但我可以看到“-Wl,-rpath/app/lib”被传递给gcc


我希望避免在构建环境中创建空的“/app/lib”,但我不想更改目标平台上的文件结构。如果从生成环境中删除/app/lib,则生成时会出现一个错误,即找不到它。有没有一种方法可以指定运行时搜索路径,而不需要在链接时将其存在?

我认为您正在寻找的选项是
-Wl,-rpath link,/path/to/libraries
。您需要同时使用这两个选项


然后链接器将使用
-rpath link
在链接时查找库,但它会将
-rpath
值编码为二进制,以便在运行时使用。

语法应为“-Wl,-rpath-Wl,/app/lib”(“-Wl,-rpath,/app/lib”也可以使用)。这是NetBeans中的一个bug。之所以不那么重要(我以前也没有注意到这一点),是因为链接时间搜索路径似乎一直延续到运行时。由于NetBeans没有在-rpath和/app/lib之间放置逗号,/app/lib被解释为链接时搜索路径。因此,在运行时仍然可以在适当的位置找到我的依赖库,但由于它是链接时依赖,链接失败,因为/app/lib不存在。

-Wl,-rpath/app/lib
是一个不正确的选项规范,应该是
-Wl,-rpath-Wl,/app/lib
(可能还有其他方法,但这是有效的,不需要在生成主机上使用dir)。您是否在此处错误复制了生成选项?我返回并仔细检查了,但我已确认调用正在生成为“gcc-o…-Wl,-rpath/app/lib…”.NetBeans正在生成此makefile,因此,如果它无效,则可能需要对其进行修复。但是,如果我的生成环境中存在/app/lib,生成的二进制文件在运行时使用该路径,则生成过程确实会成功。奇怪的是……我认为这不起作用。稍后我将查看是否可以重新编写,这似乎有点奇怪。Mat的语法完全正确应该是“-Wl,-rpath-Wl,/app/lib”(“-Wl,-rpath,/app/lib”也可以使用)。这是NetBeans中的一个错误。为什么它不更重要(为什么我以前没有注意到这一点)链接时搜索路径似乎一直延续到运行时。由于NetBeans没有在-rpath和/app/lib之间放置逗号,/app/lib被解释为链接时搜索路径。因此,在运行时仍然可以在适当的位置找到我的依赖库,但由于它是链接时依赖项,因此链接失败use/app/lib不存在。Mat,如果你想将你的评论作为答案发布,我会给你评分。非常感谢你的帮助!