在ubuntu 64位上编译32位程序(libjvm.so问题)



已解决

我刚刚安装了"sudo apt-get-install gcc multilib",它允许使用以下命令成功编译:

gcc-m32-o invoke-I$JAVA_HOME/include-I$JAVA-HOME/include/linux cCode.c$JAVA_HOME/jre/lib/i386/server/libjvm.so

比你们所有人都多

以下是可下载的源代码:http://cfile237.uf.daum.net/attach/247819495212DF1C07B9EB

首先,我的ubuntu是64位12.04LTS。并且,我安装了最新jdk 1.7.0_25的64位和32位版本。

我试图在我的64位Ubuntu上使用jdk版本的32位库编译上面的源代码,它显示了以下错误:

/usr/lib/jvm/jdk1.7.0_25_x86/jre/lib/i386/server/libjvm.so: could not read symbols: File in wrong format
collect2: ld returned 1 exit status

然而,如果我尝试使用jdk版本的64位库编译这些源代码,它编译得很好,运行得很好。

我的问题是,正如你所知,如何在64位Ubuntu平台上使用32位版本的jdk库使其编译并运行良好?

啊,在我编译之前,我总是在终端上键入以下命令,

用于32位编译

export PATH=$PATH:/usr/lib/jvm/jdk1.7.0_25_x86/bin
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_25_x86
export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/i386:$JAVA_HOME/jre/lib/i386/server

用于64位编译

export PATH=$PATH:/usr/lib/jvm/jdk1.7.0_25_x64/bin
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_25_x64
export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64:$JAVA_HOME/jre/lib/amd64/server

首先,请注意Java程序本身不是32位或64位的。

使用32位或64位JDK编译代码并不重要,生成的Java字节码将完全相同。使用32位JDK编译的代码将在64位JRE上运行,反之亦然。因此,您不需要使用32位和64位JDK编译代码。

我不知道问题的确切原因,但您可能以某种方式混合了32位和64位JDK的一部分,这将不起作用。

安装ubuntu 32位兼容库(ia32-libs)。

sudo apt-get install ia32libs

这是我的Makefile(确保安装了所有依赖的软件包)

JDK32 = /usr/lib/jvm/java-1.7.0-openjdk-i386
JDK64 = /usr/lib/jvm/java-1.7.0-openjdk-amd64
all: invoke_amd64 invoke_x86
invoke_x86: cCode.c
    $(CC) -m32 -I$(JDK32)/include $^ -L$(JDK32)/jre/lib/i386/server -ljvm -Wl,-rpath -Wl,$(JDK32)/jre/lib/i386/server -o $@
invoke_amd64: cCode.c
    $(CC) -I$(JDK64)/include $^ -L$(JDK64)/jre/lib/amd64/server -ljvm -Wl,-rpath -Wl,$(JDK64)/jre/lib/amd64/server -o $@
clean:
    rm invoke*

最新更新