如何使用 JNI/JNA 可以使用的 automake 创建共享库(dylib)?
Posted
技术标签:
【中文标题】如何使用 JNI/JNA 可以使用的 automake 创建共享库(dylib)?【英文标题】:How to created a shared library (dylib) using automake that JNI/JNA can use? 【发布时间】:2013-01-07 20:43:31 【问题描述】:如何说服 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 找到库但找不到入口点。
我阅读了“如何在 automake 脚本中创建共享库 (.so)?”线程,它有很大帮助。我得到了使用 -shared 标志创建的 dylib(根据生成的 Makefile)。但是当我尝试从 Java Native Access 中使用它时,我得到一个“找不到符号”错误。
查看由 Makefile 生成的 libclique.la
,它似乎没有任何关键信息,只是看起来是链接重载和移动内容以方便后续 C/C++ 编译器步骤(我没有),所以我希望libclique.1.dylib
是一个正常运行的动态库。
我猜这是我出错的地方,但是,鉴于 JNA 直接链接到一个 dylib 并且没有用它编译(根据上面引用的讨论中的示例),似乎所有后续编译步骤LibTools 手册中的描述没有实际意义。
注意:我在 Mac 上进行测试,但我还必须在 Windows 和 Linux 机器上执行此操作,这就是我尝试将其放入 Automake 的原因。
注意 2:我使用 Eclipse 进行 Java 开发,是的,我确实导入了 dylib。
谢谢
【问题讨论】:
nm
告诉您关于 .dylib 中的符号的哪些信息?您要查找的符号是否确实在显示的列表中?
很好的问题,然后继续。 LibTools 创建的 dylib 是 dyld_stub_binder,不是真正的 dylib。这令人费解,因为上面提到的文章声称创建了一个功能性的 .so 文件。也许问题是我只需要一个 dylib,我不需要编译可执行文件(实际上我不能,因为 Java 没有被编译,而 JNA 是一个独立的 jar 文件)。所以问题就变成了,如何将 LibTools 输出的内容转换为 gcc 创建的独立 dylib。谷歌没有帮助。
@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 phylip.o Slist.o dumptree.o clique.o disc.o -lm libtool:链接:gcc -Wall -Wfatal-errors -DNDEBUG -O3 -o clique phylip.o Slist.o dumptree.o clique.o disc.o -lm 看起来都不错。
@technomage 添加了几个 cmets,但忘记标记给你了。
好吧,我大吃一惊!通过添加 LibTools,我的可执行文件(clique)现在也是一个 dylib,可以由 JNA 直接访问。甚至 LibTool 手册也没有提到这一点。问题以一种非常意想不到的方式解决了。感谢您的帮助。
【参考方案1】:
你应该是building a plugin,尤其是通过
libclique_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
这样你告诉 libtool 你想要一个动态加载的模块而不是一个共享库(对于 ELF 是一样的,但对于 Mach-O 不是。)
【讨论】:
以上是关于如何使用 JNI/JNA 可以使用的 automake 创建共享库(dylib)?的主要内容,如果未能解决你的问题,请参考以下文章
Deep-Trimap-Generation-for-Automatic-Video-Matting-using-GAN