Libtool链接共享库对着由显式路径给出的静态库(没有-l选项)

时间:2013-12-20 11:42:24

标签: gcc static-libraries ld libtool

我想将静态库(libyaml-cpp)中的所有符号拉到我正在构建的共享符号(libLHAPDF)中,以避免对后者的用户显式依赖。 (这不是我最喜欢的做事方式,但是安装先决条件的难度是关于包的常规负面反馈。)所以我尝试使用像这样的automake规则构建我的共享库的相关位:

libLHAPDFInfo_la_LDFLAGS = $(AM_LDFLAGS) \
  $(srcdir)/yamlcpp/yaml-cpp/libyaml-cpp.a

我特别想要这样的东西而不是

libLHAPDFInfo_la_LDFLAGS = -L$(srcdir)/yamlcpp/yaml-cpp -lyaml-cpp \
  $(AM_LDFLAGS) 

因为可能在系统的其他地方安装了libyaml-cpp的共享lib版本,而我想要使用它。 (在后一种情况下,奇数标志排序是为了确保-lyaml-cpp找到srcdir中构建的那个......是的,它确实是srcdir而不是builddir在这种情况下!)

但是,第一个版本会发出警告,我宁愿没有:

*** Warning: Linking the shared library libLHAPDFInfo.la against the
*** static library ./yamlcpp/yaml-cpp/libyaml-cpp.a is not portable!

更重要的是它实际上不起作用:如果我在生成的库上运行nm,我会看到未定义的符号:

$ nm src/.libs/libLHAPDFInfo.a | grep YAML
U _ZN11LHAPDF_YAML4NodeC1Ev
U _ZN11LHAPDF_YAML4NodeD1Ev
...

(详细信息:libLHAPDFInfo.a是一个noinst_LTLIBRARIES条目,用作构建最终共享库的中间件。因此,当将一个静态 lib链接到另一个时,这甚至不起作用。并且避免使用符号冲突,捆绑的版本有点被黑客攻击,将YAML命名空间重命名为LHAPDF_YAML:这不会改变任何东西,但我想我会提到它,以防这些符号名称对你来说很奇怪。)

如果我使用第二种形式的链接标志(-lyaml-cpp方式),我将获取libLHAPDFInfo.a中的所有LHAPDF_YAML符号,然后进入共享库。并且不再有关于静态库链接的不可移植性的警告(使用-fPIC构建,因此 有效执行此操作)。但是如果在系统上也找到了共享的libyaml-cpp,那么无论-L / -l标志的排序如何,它都会被使用 - 这是我不想要的。

有关如何确保在特定路径上使用库的版本,同时正确复制符号并避免libtool警告的任何建议吗?

编辑:说过我可以通过-lyaml-cpp标志将符号从libyaml-cpp.a复制到libLHAPDFInfo.a中,经过多次迭代后,我再也无法通过这种方式显示通过nm的预期符号。查看libtool在执行libLHAPDFInfo.a时执行的ar / ranlib命令,-l参数似乎完全被删除。所以我不知道它是如何工作的...据我所知,它不是libtool支持的模式,而不是记录的模式。最后,我将libyaml-cpp重命名为liblhapdf-yaml-cpp.a作为构建的一部分(因为不应该意外地找到具有该名称的lib),并将其链接到 final 共享libLHAPDF中。而不是静态便利的lib。不像我喜欢的那样整洁 - 我希望将所有yaml-cpp依赖处理隔离到一个便利库的构建中,并且依赖文件副本来消除库查找的歧义并不令人满意 - 但它可以工作。

0 个答案:

没有答案