Связывание оболочки libtool программы automake

Я в тупике на ссылке automake. Даже после многочасового изучения руководств и поиска в Интернете это, вероятно, неправильное понимание автоинструментов.

У меня есть одна библиотека .la, созданная libtool, одна общая библиотека .dylib, и я создаю программу. .la связан с .dylib, и программа использует .la.

Makefile.am для библиотеки .la

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

Некоторые вещи, которые я пробовал, добавляли -Ldir/to/ -lB к test_LDFLAGS в дополнение к тому, что уже было добавлено в test_LDADD. И попытался установить test_LDFLAGS = -rpath -Ldir/to в надежде, что установка пути поиска во время выполнения к каталогу, в котором находится B.dylib, поможет.

Если я вручную экспортирую DYLD_LIBRARY_PATH, чтобы включить /dir/to/B.dylib, тогда тестовая программа сможет работать, но я хочу, чтобы автоинструменты позаботились об этом, а не требовали, чтобы кто-то экспортировал путь, прежде чем он сможет его запустить.


person Sweetness    schedule 06.10.2015    source источник


Ответы (2)


libB.dylib включает rpath, который копируется в ваш двоичный файл и используется для разрешения -lB во время выполнения.

И кажется, что этот rpath не /path/to, поэтому libB.dylib не может быть разрешен компоновщиком времени выполнения. Причина, по которой это работает для libA.la, заключается в том, что libtools знает, что rpath в libA.dylib в любом случае неправильный (поскольку вы не сделали make install), и поэтому его нужно установить вручную.

Единственный способ обойти это, который я нашел, - использовать install_name_tool для исправления сохраненного rpath в результирующем двоичном файле. (то есть: я не думаю, что libtool сделает это за вас, так как это противоречит намеренному использованию libB.dylib - как заявлено в его rpath)

person umläute    schedule 06.10.2015

Проблема в том, что Libtool не участвовал в создании libB.dylib, поэтому он не знает, как исправить вашу среду, чтобы найти ее. Это означает, что это зависит от вас. Вы можете добавить path/to/libB в свою среду или добавить жестко заданный путь поиска к libA.la, чтобы libA нашла его.

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

Это не только добавит путь к B в двоичном файле libA, но и добавит его к зависимостям-библиотекам в файле libA.la Libtool, чтобы на платформах, которые не будут автоматически наследовать спецификацию rpath, он может быть добавлен Libtool при компоновке.

person Robert Boehne    schedule 06.10.2015