【问题标题】:automake program libtool wrapper linkingautomake 程序 libtool 包装器链接
【发布时间】:2015-10-06 04:53:33
【问题描述】:

我被自动制作链接难住了。即使在翻了几个小时的手册并在网上搜索之后,这也可能是对 autotools 的误解。

我有一个由 libtool 制作的 .la 库,一个 .dylib 共享库,并且正在创建一个程序。 .la 链接到 .dylib,程序使用 .la。

.la 库的 Makefile.am

lib_LTLIBRARIES = libA.la
libA_la_LDFLAGS = ${AM_LDFLAGS} -no-undefined
libA_la_LIBADD = $(LIBM) -Ldir/to/ -lB
libA_la_CPPFLAGS = ${AM_CPPFLAGS}

Makefile.am 用于带有 libtool 包装器的程序

noinst_PROGRAMS = test
test_SOURCES = test_source.c
test_LDADD = libA.la -Ldir/to/ -lB

libA.la 已创建并链接到 B.dylib,但 automake 创建的测试程序“包装器”正在导出 DYLD_LIBRARY_PATH 以查找 libA.la,但未链接到 B.dylib。给出错误

dyld: Library not loaded: ./B.dylib
  Referenced from: /dir/to/test/.libs/test
  Reason: image not found
Trace/BPT trap: 5

除了已经添加到test_LDADD 之外,我尝试过的一些事情是添加-Ldir/to/ -lBtest_LDFLAGS。并尝试设置test_LDFLAGS = -rpath -Ldir/to,希望将运行时搜索路径设置为 B.dylib 所在的目录会有所帮助。

如果我手动导出DYLD_LIBRARY_PATH 以包含/dir/to/B.dylib,则测试程序能够运行,但我希望自动工具处理此问题,而不是要求某人在运行之前导出路径。

【问题讨论】:

    标签: macos shared-libraries autotools automake libtool


    【解决方案1】:

    libB.dylib 包含一个 rpath,它被复制到您的二进制文件中,并用于在运行时解析 -lB

    而且这个rpath好像不是/path/to,所以libB.dylib不能被运行时链接器解析。 它适用于 libA.la 的原因是 libtools 知道 libA.dylib 中的 rpath 无论如何都是错误(因为您还没有完成 make install),因此需要手动设置它.

    我发现解决此问题的唯一方法是使用install_name_tool 修复生成的二进制文件中存储的rpath。 (即:我不认为 libtool 会为您执行此操作,因为它与 libB.dylib预期使用相矛盾 - 正如其 rpath 中所声明的那样)

    【讨论】:

      【解决方案2】:

      问题在于 Libtool 没有参与构建 libB.dylib,因此它不知道如何修复您的环境以找到它。这意味着它取决于你。您可以在您的环境中添加 path/to/ libB,或者将硬编码的搜索路径添加到 libA.la,以便 libA 找到它。

      libA_la_LIBADD = $(LIBM) -Ldir/to/ -rpath dir/to/ -lB
      

      这不仅会在 libA 的二进制文件中添加 B 的路径,还会将其添加到 Libtool 的 libA.la 文件中的依赖库中,以便在不会自动继承 rpath 规范的平台上,它可以由 Libtool 添加链接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多