Как создать общую библиотеку (dylib) с помощью automake, которую может использовать JNI/JNA?

Как мне убедить LibTools сгенерировать библиотеку, идентичную тому, что gcc делает автоматически?

Это работает, если я делаю что-то явно:

gcc -o libclique.dylib -shared disc.c  phylip.c Slist.c  clique.c
cp libclique.dylib [JavaTestDir]/libclique.dylib

Но если я сделаю:

Makefile libclique.la (which is what automake generates)
cp .libs/libclique.1.dylib [JavaTestDir]/libclique.dylib 

Java находит библиотеку, но не может найти точку входа.

Я прочитал "Как создать общую библиотеку (.so) в скрипте automake?" нить и это очень помогло. Я получил dylib, созданный с флагом -shared (согласно сгенерированному Makefile). Но когда я пытаюсь использовать его из Java Native Access, я получаю сообщение об ошибке «символ не найден».

Глядя на libclique.la, сгенерированный Makefile, кажется, что в нем нет какой-либо критической информации, просто выглядит как перегрузка ссылок и перемещение вещей для удобства последующих шагов компилятора C/C++ (которых у меня нет) , поэтому я ожидаю, что libclique.1.dylib будет работающей динамической библиотекой.

Я предполагаю, что именно здесь я ошибаюсь, но, учитывая, что JNA напрямую ссылается на dylib и не компилируется с ним (согласно примеру в обсуждении, приведенном выше), кажется, что все последующие шаги компиляции, описанные в Руководство LibTools спорно.

Примечание. Я тестирую на Mac, но мне также придется делать это на машинах с Windows и Linux, поэтому я пытаюсь поместить это в Automake.

Примечание 2: я использую Eclipse для разработки Java и, да, я импортировал dylib.

Спасибо


person Jim    schedule 07.01.2013    source источник
comment
Что nm говорит вам о символах в .dylib? Действительно ли искомый символ находится в отображаемом списке?   -  person technomage    schedule 08.01.2013
comment
Отличный вопрос, и в точку. dylib, созданный LibTools, представляет собой dyld_stub_binder, а не настоящий dylib. Что вызывает недоумение, поскольку в упомянутой выше статье утверждается, что был создан функциональный файл .so. Возможно, проблема в том, что мне нужен только dylib, мне не нужно компилировать исполняемый файл (на самом деле я не могу, потому что Java не компилируется, а JNA — это отдельный файл jar). Таким образом, возникает вопрос, как мне преобразовать то, что выводит LibTools, в автономную dylib, такую ​​​​как создает gcc. Гугл не помогает.   -  person Jim    schedule 08.01.2013
comment
@ Oz123 Провел еще немного тестирования, изменив что-то в одной из частей библиотеки и выполнив сборку. Получил следующее (извините за обертку): make all-am gcc -DHAVE_CONFIG_H -I. -Wall -Wfatal-errors -DNDEBUG -O3 -MT clique.o -MD -MP -MF .deps/clique.Tpo -c -o clique.o clique.c mv -f .deps/clique.Tpo .deps/clique .Po /bin/sh ./libtool --tag=CC --mode=link gcc -Wall -Wfatal-errors -DNDEBUG -O3 -o clique philip.o Slist.o dumptree.o clique.o disk.o -lm libtool: ссылка: gcc -Wall -Wfatal-errors -DNDEBUG -O3 -o clique phylip.o Slist.o dumptree.o clique.o disk.o -lm Все выглядит хорошо.   -  person Jim    schedule 08.01.2013
comment
@technomage Добавил пару комментариев, но забыл пометить их для вас.   -  person Jim    schedule 08.01.2013
comment
Ну, я ошарашен! Благодаря добавлению LibTools мой исполняемый файл (клика) теперь также является dylib и может быть доступен непосредственно JNA. Даже в руководстве LibTool об этом не упоминается. Проблема решена, правда, очень неожиданным образом. Спасибо за помощь.   -  person Jim    schedule 09.01.2013


Ответы (1)


Вы должны создать плагин и, в частности, передать

libclique_la_LDFLAGS = -avoid-version -module -shared -export-dynamic

Таким образом вы сообщаете libtool, что вам нужен динамически загружаемый модуль, а не разделяемая библиотека (что для ELF одно и то же, а для Mach-O — нет).

person Diego Elio Pettenò    schedule 06.01.2015