【发布时间】:2021-10-29 15:02:17
【问题描述】:
我正在尝试构建一个与共享库 libA.so 链接的 C++ 可执行文件。 libA.so 被构建并与另一个共享库 libB.so 链接。 libB.so 是使用 -rpath 构建的,用于在我的主目录 (liblapack.so) 中查找系统库的自定义构建。如果我在 libB.so 上执行“readelf -d”,我会将 liblapack.so 视为“NEEDED”,并且还会看到“RPATH”下列出的自定义构建路径。如果我对 libA.so 执行“readelf -d”,我只会看到 libB.so 列为“NEEDED”;没有 RPATH 条目。然后,当我尝试使用 libA.so 构建我的 exe 时,它没有在 libB.so 中指定的自定义路径中查找;它正在拾取系统位置中的一个,该位置没有正确的功能,因此链接失败。有谁知道实现我想要在这里做的事情的方法?有没有办法让 libB 的 RPATH 条目传播到 libA?
我在 RHEL 7 上使用 GCC 9。
提前致谢。
ETA:应用程序、libA 和 libB 都是独立的包,所以我更愿意让它们的构建过程和不寻常的 rpath 信息只有他们自己知道。我可以更改每个黑匣子的链接标志。它们也是已建立的软件包,因此我无法更改为 autoconf 或类似的东西。
ETA2:重申一下,当我构建 libA 并与 libB 链接时,它确实将 libA 标记为需要 libB,这很棒。然后应用程序可以与 libA 链接并隐式获取 libA 需要运行的 libB。但是为什么将 libB 与 libA 链接会丢弃 libB 的 rpath 信息?或者,当应用程序链接时,为什么它看不到,因为 libA 需要 libB,与 libB 链接并保留 libB 的 rpath 规范?最重要的是,libB 的 rpath 规范正在某个地方丢失,而且看起来不应该这样。 (顺便说一句:这对我来说是新事物,所以我不怀疑我认为它应该工作的方式存在问题。但从逻辑上讲,这听起来对我来说是正确的。)
【问题讨论】:
-
您是否尝试指定构建
libA时所需的-rpath条目? -
我在构建 libA 时没有尝试指定 -rpath,但我假设它会起作用。它们是单独的包,所以我想尽可能避免它。也许必须这样做。
-
有些工具可以自动处理类似的技术细节。像 autmake 和 libtool 这样的工具负责管理这些包间的依赖关系。
-
考虑到这些软件包很难。也许不是这样,但是链接器不能只携带 libB 的 RPATH 条目吗?这样就可以解决问题,而且看起来很明智。
-
除非与问题相关的所有相关信息都包含在问题本身中,否则任何人都不太可能帮助回答问题。否则,任何提供的建议都可能导致这种“但由于我现在第一次提到的
而这不起作用”的响应,并浪费大家的时间。
标签: c++ linux shared-libraries