您的位置:首页 > 编程语言 > Java开发

Ubuntu14.04编译OpenJDK8遇到的一些问题

2017-03-25 00:00 337 查看
摘要: 编译openjdk的资料已经被很多人写过了,我这里就不再详细的说了,大概记录一下我的编译脚本和编译过程中遇到的一些问题。

目标:编译openjdk8

环境:ubuntu14.04.1 ,还有一些依赖包可以通过一条命令来安装

sudo apt-get install build-essential libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libfreetype6-dev libasound2-dev

全编译:

1.下载openjdk源代码

hg clone http://hg.openjdk.java.net/jdk8/jdk8
需要安装Mercurial库。

2.配置环境变量

export LANG=C

#在openjdk8中已经把ALT开头的环境变量遗弃了,BOOTDIR可以通过后面的Configure文件进行配置
#export ALT_BOOTDIR=/usr/lib/jvm/jdk1.8.0_121
#export ALT_JDK_IMPORT_PATH=/usr/lib/jvm/jdk1.8.0_121
#export ALT_BOOTDIR=/usr/lib/jvm/java-7-oracle
#export ALT_JDK_IMPORT_PATH=/usr/lib/jvm/java-7-oracle

export ALLOW_DOWNLOADS=true
export HOST_BUILD_JOBS=6
export USE_PRECOMPILED_HEADER=true

export BUILD_LANGTOOLS=true
#export BUILD_JAXP=true
#export BUILD_JAXWS=true
#export BUILD_CORBA=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true

export BUILD_INSTALL=false

#export ALT_OUTPUTDIR=/home/archer/dev/openjdk_build
unset JAVA_HOME
unset CLASSPATH

export WARNINGS_ARE_ERRORS=false
export SKIP_DEBUG_BUILD=false
export SKIP_FASTDEBUG_BUILD=true
export DEBUG_NAME=debug

3.执行configure

configure --with-boot-jdk=/opt/java/jdk7

还有一些其他的参数也可以这么配置,比如:64位操作系统编译64位虚拟机还需要添加参数--with-target-bits=64.这个文件可以执行多次。

4.开始编译

make all。

5.查看结果

编译后的结果就在build/linux-x86_64-normal-server-release/image/j2sdk-image

6.单独编译HOTSPOT

#export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
#export JAVA_HOME=/usr/lib/jvm/java-7-oracle/

ALT_BOOTDIR=$JAVA_HOME
export ALT_BOOTDIR

ALT_JDK_IMPORT_PATH=$JAVA_HOME
export ALT_JDK_IMPORT_PATH

ANT_HOME=/usr/share/ant/bin
export ANT_HOME

PATH=$ANT_HOME/bin:$PATH
export PATH

HOTSPOT_BUILD_JOBS=6
export HOTSPOT_BUILD_JOBS

ALT_OUTPUTDIR=/home/archer/dev/openjdk_build
export ALT_OUTPUTDIR

export ARCH_DATA_MODEL=64

mkdir -p $ALT_OUTPUTDIR
rm -f $ALT_OUTPUTDIR/hotspot_debug.log

cd make
DEBUG_BINARIES=true make clean debug debug1 2>&1 | tee $ALT_OUTPUTDIR/hotspot_debug.log

单独编译hotspot还是可以用ALT开头的配置的。编译的结果就在ALT_OUTPUTDIR目录下,根据编译的级别找相应的目录,例如这里是debug,debug目录下就是编译的内容。

7.编译过程中遇到的一些问题

问题1:[2]/usr/include/features.h:356:25: 致命错误: sys/cdefs.h:没有那个文件或目录
To compile 32 bit binaries on 64 bit Linux version, you have to Install libx32gcc development package and 32 bit GNU C Library
try this

解决
sudo apt-get install libx32gcc-4.8-dev
sudo apt-get install libc6-dev-i386

问题2:/usr/include/c++/4.8/new:39:28: fatal error: bits/c++config.h: 没有那个文件或目录
解决:sudo apt-get install gcc-4.8-multilib g++-4.8-multilib (对应gcc -v版本)

问题3:cc1plus: error: the "stabs" debug format cannot be used with pre-compiled headers [-Werror=deprecate]
解决:因为高版本的gcc不再支持stabs,解决办法:在make命令中加上 DEBUG_BINARIES=true

这几个是我编译的时候问题。

以上就是编译openjdk8的整个过程,其实在编译之前可以看看源代码文件夹下的README-builds.html,里面是官方对编译过程的一些参考

PS:但我在编完用GDB测试hotspot的时候报错,Unable to load native library: /usr/lib/jvm/java-7-oracle/jre/lib/amd64/libjava.so: symbol JVM_SetProtectionDomain, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference

我一查,发现jdk8中JNI把JVM_SetProtectionDomain删了,在hotsopt脚本中的执行jdk是之前定义的BOOTJDK,也就是jdk7,所以用jdk7来测试我们8编译出来的虚拟机,就报错了,把hotspot中的jdk改成我们编译出来的JDK就可以成功执行了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息