Macos 自动生成程序libtool包装链接

Macos 自动生成程序libtool包装链接,macos,shared-libraries,autotools,automake,libtool,Macos,Shared Libraries,Autotools,Automake,Libtool,我被汽车制造商的链接难住了。即使在翻了几个小时的手册并在网上搜索之后,这也可能是对自动工具的误解 我有一个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_CPP

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

我有一个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}
使用libtool包装器的程序的Makefile.am

noinst_PROGRAMS = test
test_SOURCES = test_source.c
test_LDADD = libA.la -Ldir/to/ -lB
libA.la已创建并链接到B.dylib,但automake创建的测试程序“包装器”正在导出
DYLD\u LIBRARY\u路径
以查找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/-lB
添加到
test\LDFLAGS
中。并尝试将
test\u LDFLAGS=-rpath-Ldir/to
设置为,希望将运行时搜索路径设置为B.dylib所在的目录会有所帮助

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

libB.dylib包含一个
rpath
,该路径可以复制到二进制文件中并用于在运行时解析
-lB

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

我发现的唯一解决方法是使用
install\u name\u tool
修复结果二进制文件中存储的
rpath

(也就是说:我不认为
libtool
能为您做到这一点,因为它与它的rpath中声明的
libB.dylib
-的预期用途相矛盾)

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

libA_la_LIBADD = $(LIBM) -Ldir/to/ -rpath dir/to/ -lB
这不仅会将路径添加到libA的二进制文件中的B,还会将其添加到Libtool的libA.la文件中的依赖项libs中,以便在不会自动继承rpath规范的平台上,Libtool可以在链接时添加该路径