libtool中的相对路径或独立路径.la文件

9
我的 .la 文件在 dependency_libs=libdir= 部分都有完整的路径名,这使得将我的库复制到其他机器(同一架构但不同路径结构)变得困难。 除了编写某些脚本来修改新机器上路径的方式,还有什么解决方法吗?
当我使用 --prefix--exec-prefixDESTDIR= 标志进行 ./configure; make; make install 安装我的 libfoo时,会在 libfoo.la 文件中得到一个条目,该条目读取 libdir=/dir1/lib,而我实际上将 .so 文件放在与 libfoo.la 相同的目录中。 这时,只要将它们打包并放在另一台机器上,就会出现问题。
假设我在第二台机器上有依赖于 libfoolibbar。 当我使用 -L/dir2/lib 标志查找 -lfoo 时,由于 libfoo.la 文件期望 foo 已安装在 /dir1/lib(来自第一台机器),但实际上它在 /dir2/lib 中,所以会导致 libbar 的编译/链接失败。我需要将所有的 dir1 替换为正确的路径,这两个路径可能都很长且复杂。
如何避免这个问题?

你尝试过使用automake手册中的分阶段安装方法吗?(http://www.gnu.org/software/automake/manual/html_node/DESTDIR.html) - DanielKO
我已经这样做了,这就是为什么我提到了前缀和DESTDIR标志。所有这些对我能做的就是把我的输出放在某个目录中...尽管如此,.la文件中将有一个绝对路径,所以当我移动它们时会遇到问题。 - s g
你找到解决这个问题的方法了吗?除了黑客攻击.la文件。 - amaslenn
1
这是多年前的事了,但我仍记得当时没有找到好的解决方案 :-\ - s g
刚刚偶然发现了这个问题,而且在交叉编译时仍然在苦苦挣扎。不知何故,在执行 make install 时,一定可以向 libtool 提供 sysroot 或类似的东西,对吧?手动编辑 .la 依赖路径真是太烦人了。或者,不使用在主机上使用 make install DESTDIR 将库安装到 sysroot 的更好做法是将其复制到目标机器上?有太多问题了。 :D - YVbakker
1个回答

0

这个问题包含一些误解,特别是在这里:

当我使用我的-L/dir2/lib标志来查找-lfoo时,由于libfoo.la文件期望foo被安装在/dir1/lib中,所以libbar编译/链接失败。

如果使用-L/dir2/lib -lfoo链接失败,那不是因为libfoo.la中的任何内容。 .la文件仅由libtool使用。它不参与其他方式进行的链接。实际上,可以完全删除它而不影响链接。如果/dir2/lib/libfoo.so是适当架构的共享库,并且在库搜索路径中没有libfoo.solibfoo.a,那么-L/dir2/lib -lfoo选项将导致考虑共享库的标准Unix编译器或链接器尝试在链接中包含/dir2/lib/libfoo.so

在问题中没有提供链接错误信息,而且这么长时间过后,我不指望会有任何补充。没有这些信息,就不清楚问题的实际性质是什么了。许多可能性中,最有可能的是:

  • 该库是为错误的架构构建的(可能是x86与x86_64)。在这种情况下,需要从源代码构建适用于第二台机器的库版本。
  • 安装在第二台机器上的库的所有权和权限不允许OP在那里构建。在这种情况下,应修复所有权和/或权限。
  • 库具有未在第二台机器上正确满足的依赖项。在这种情况下,需要安装依赖项,并可能包含在链接中。
  • 该库对其安装目录非常敏感。这在Linux上永远不会发生,但在某些其他类型的机器上可能会发生。在这种情况下,libtool可以使用.la文件将库放置在构建时指定的位置,但需要重新构建才能从不同位置使用。
  • 实际上根本不是链接错误,而是涉及库的运行时失败。这可能是因为/dir2/lib/libfoo.so不在第二个系统的运行时库搜索路径中,或者因为它依赖于其他库。在基于ELF的系统上,libtool将在库中插入RPATH条目,但它们可能不适合不同的安装目录。它们甚至可能积极引起此类问题。适当更新动态链接器的配置可能有助于解决此问题。
我该如何避免这个问题呢?实际上,这并不是你想象中的那种问题。如果没有更多的信息,我只能提供一些一般性的建议:
使用Autotools构建系统时,请为正确的安装目录进行构建。不要假设结果可以重定位到不同的安装目录(尽管可能会)。不同的“机器”是可以的,如果足够相似,但不是不同的位置。但是,如果您希望最有可能能够重新定位安装,则应考虑使用诸如chrpath之类的工具从库中删除RPATH条目,甚至在构建时黑客libtool以防止其首先添加一个。特别是如果您预计将库安装在其configure的位置之外。
确保配置系统的动态链接器在其搜索路径中具有安装目录。
如果更改安装路径,则删除已安装的.la文件,即使您没有更改安装路径也可能需要删除。
确保所有库的依赖项也已安装并在动态链接器的搜索路径中,并且它们实际上是兼容的。
所有这些都与RedHat的RPM打包准则一致,这些准则完全符合在一台机器上构建软件以供在另一台机器上安装和使用的情况。然而,并非所有内容都是必需的,尤其是关于RPATH的一些内容,还存在一些替代哲学。当您具有更多经验时,可以自由地忽略其中许多内容以及该主题上的任何其他建议。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接