2015-10-06 6 views
0

Я в тупик на автомат ссылку. Даже после многократного перелистывания руководств и поиска в Интернете это, вероятно, недоразумение autotools.automake program libtool wrapper linking

У меня есть одна библиотека .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, но программа испытаний " wrapper ", созданный 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, тогда тестовая программа может работать, но я ищу, чтобы autotools позаботился об этом, вместо того чтобы требовать, чтобы кто-то экспортировал путь, прежде чем он сможет его запустить.

ответ

1

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)

1

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

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

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