У меня есть проект, который генерирует статическую библиотеку L. Некоторая функция L имеет возможность загружать некоторые плагины M (используя dlopen("libmmmm.so")
: M является общей библиотекой (модулем)).
Тест T, проверяющий функцию module_load()
L, состоит из основного теста T (с которым L статически связан) и плагина M для проверки его загрузки в T+L.
Тесты являются частью установки (определяется testdir).
Далее следует Makefile.am в тестовом каталоге T (сборка T и M):
#the test program linked with the static lib L:
#(the tests are distributed as well, hence the test_* prefix)
test_PROGRAMS = tttt
tttt_SOURCES = tttt.c
tttt_LDADD = llll.la
#the module to be loaded by the T+L test:
lib_LTLIBRARIES = libmmmm.la
libmmmm_la_SOURCES = mmmm.c
libmmmm_la_LDFLAGS = $(AM_LDFLAGS) -module -shared
Проблема заключается в пути, по которому можно найти модуль: тест работает (т.е. найден libmmmm.so) для проверки make. Но не работает для сборок вне дерева (VPATH) (общая библиотека не найдена).
Так вот вопрос: как это должно работать? libtool должен установить что-то вроде LD_LIBRARY_PATH, я думаю, поскольку dlopen()
никогда не поймет обертку *.la
...
Итак, что он делает и как я могу исправить это, чтобы он работал всегда, т. е. make check, out of tree build, make distcheck... Жесткое кодирование пути поиска в каталоге .libs
не кажется очень переносимым: мы используем автоинструменты, потому что мы ориентируемся на множество различных платформ.
PS: я знаю, что префикс "lib" M может быть опущен из-за опции "-module"
libltdl
не обременяется GPL, если ваше программное обеспечение создано сlibtool
. Он портативный и пытается эмулировать функциональность, если она не предусмотрена конкретной платформой. Модули кратко упоминаются в руководствеautomake
. Более подробный обзорautomake
иlibltdl
можно найти вlibtool
< /а> руководство. - person Brett Hale   schedule 21.10.2016