【发布时间】:2012-02-16 04:49:17
【问题描述】:
在 AIX 6.1 ppc64 上,为了加载 libm.a,我们的应用程序使用 System.loadLibrary("m")。
或者它失败并显示错误消息
模块的幻数无效
根据 IBM 文档,当 32 位和 64 位二进制文件不匹配时,可能会发生这种情况。或者无论我们使用 Java6(32 位)还是 Java6_64(64 位)JVM,都会发生这种情况。 所以事实并非如此。
另一个可能的原因是/usr/lib/libm.a 不是共享库。但是我们就是在平台上找不到共享模式libm.a来使用!
根据 Javadoc,在 System.loadLibrary("name") 中,“name”到真实库的映射取决于系统。在大多数 Unix 系统上,它被映射到 lib.so,而在 AIX 上,它被映射到 lib.a;请注意,在 AIX 上,.a 可以是混合的,即。它可以包含静态和共享对象,32 位和 64 位对象。我的问题是在 AIX 上找到一个共享模式 libm.a。
有人知道如何使用System.loadLibrary("m") 来加载libm.a吗?
附言
System.loadLibrary("m") 在我们测试过的大多数 UNIX 平台上都能正常工作。
【问题讨论】:
-
可能是错的,但在 Linux/Unix 环境中以“.a”结尾的文件不是通常编译的静态对象,需要链接以形成二进制文件吗? AFAIK,共享对象(动态库)以 .so 结尾。
-
只能动态加载共享库。
.a库需要编译到程序中。对于 JVM,在构建 JVM 时。 -
根据 Javadoc,在 System.loadLibrary("name") 中,“name”到真实库的映射取决于系统。在大多数 Unix 系统上,它被映射到 lib
.so,而在 AIX 上,它被映射到 lib .a ;请注意,在 AIX 上,.a 可以是混合的,即。它可以包含静态和共享对象,32 位和 64 位对象。我的问题是在 AIX 上找到一个共享模式 libm.a... -
@esaj:AIX 在这方面有点奇怪。引用手册:“AIX 上共享对象的命名约定是 name.o”和“AIX 上共享库的命名约定格式为 libname.a”publib.boulder.ibm.com/infocenter/comphelp/v7v91/…
-
您能解释一下为什么需要从 Java 加载 libm 吗?
标签: java native aix loadlibrary