在Ubuntu 18.04下编译OpenJDK 11

发布于:2025-04-22 ⋅ 阅读:(10) ⋅ 点赞:(0)

在Ubuntu 18.04下编译OpenJDK 11

源码下载地址:

链接: https://pan.baidu.com/s/1QAdu-B6n9KqeBakGlpBS3Q 密码: 8lho

Linux下的环境要求

不同版本的jdk会要求在不同版本的Ubuntu下编译,不要用太高版本的Ubuntu或者gcc,特别是gcc,这个跟glibc的版本还绑定,如果gcc版本太高,则glibc版本也高,也会影响openjdk的编译。

gcc7,freetype2

可以直接使用apt-get install安装

编译OpenJDK11

先configure,再make

configure可以参考openjdk/doc/building.html

安装必要的库

sudo apt-get install build-essential

由于jdk的编译需要一个boot-jdk,即自举用的jdk。因此,需提前安装一个openjdk11。

sudo apt install openjdk-11-jdk -y

安装完毕之后查看version

jx@ubuntu:~$ which java
/usr/bin/java
jx@ubuntu:~$ java --version
openjdk 11.0.19 2023-04-18
OpenJDK Runtime Environment (build 11.0.19+7-post-Ubuntu-0ubuntu118.04.1)
OpenJDK 64-Bit Server VM (build 11.0.19+7-post-Ubuntu-0ubuntu118.04.1, mixed mode, sharing)

此时发现默认安装的jdk是11.0.19。由于自举jdk只能是N或者N-1版本,因此,我们选择一个比当前安装jdk稍微大一点的版本进行编译以保证成功。

git checkout -b jdk-11+19 jdk-11+19

我的configure按照以下命令

bash configure --with-debug-level=slowdebug --disable-warnings-as-errors

如果不能产生调试信息

bash configure --with-native-debug-symbols=internal --with-debug-level=slowdebug --with-jvm-variants=server --with-jvm-features=minimal --disable-warnings-as-errors

make

make CONF=macosx-x86_64-server-slowdebug

不要怀疑源码的Makefile有问题,当报错时,可能是gcc版本太高了,建议使用7或8。

交叉编译AArch64

  1. 首先在x86上安装openjdk11

  2. 安装必要的工具和依赖项

sudo apt-get install autoconf libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libasound2-dev libfontconfig1-dev
  1. 安装gcc
sudo apt install gcc-7 g++-7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 --slave /usr/bin/g++ g++ /usr/bin/g++-7 --slave /usr/bin/gcov gcov /usr/bin/gcov-7
  1. 安装aarch64的交叉工具链
sudo apt install gcc-7-aarch64-linux-gnu g++-7-aarch64-linux-gnu
  1. 安装x11
sudo apt install x11proto-core-dev  x11proto-input-dev x11proto-kb-dev x11proto-render-dev x11proto-xext-dev libxi-dev

然而,这样安装并不能把x11放在交叉工具链的目录中,需要进行如下操作

cd /usr/aarch64-linux-gnu
sudo ln -sf /usr/include/X11 ./X11
sudo cp /usr/lib/x86_64-linux-gnu/libX11.so* /usr/aarch64-linux-gnu/lib/
sudo cp /usr/lib/x86_64-linux-gnu/libXext.so* /usr/aarch64-linux-gnu/lib/
sudo cp /usr/lib/x86_64-linux-gnu/libXrender.so* /usr/aarch64-linux-gnu/lib/
sudo cp /usr/lib/x86_64-linux-gnu/libXtst.so* /usr/aarch64-linux-gnu/lib/
sudo cp /usr/lib/x86_64-linux-gnu/libXt.so* /usr/aarch64-linux-gnu/lib/

然而,上述的方法安装的是x86_64架构下的libX,此时需要将获得libX11aarch64版本:

  • 方法1:

[如何交叉编译X11](ubuntu使用arrch64 arm进行交叉编译 X11_x11extra 交叉编译-CSDN博客)

  • 方法2:(我采用的是这个方法)

拷贝一台aarch64机器上的libX库到/usr/aarch64-linux-gnu/lib/里。

其中,ARM机器的库位置在/usr/lib/aarch64-linux-gnu

注意,拷贝这些.so文件不包括libX11.so,这个文件是一个软连接文件。如果报错误表示libX11.so不兼容,则建立与libX11.so.6.3.0的软链接。其他类似的文件也是如此。如果不知道软链接的具体关联位置,请查找x86机器中/usr/lib/x86_64-linux-gnu里面的关系。

ln -sf /usr/aarch64-linux-gnu/lib/libX11.so.6.3.0 /usr/aarch64-linux-gnu/lib/libX11.so 
  1. 安装freetype

如果上述网址无法下载,则通过浏览器的搜索找到对应的deb包,下载后通过dpkg进行安装。安装时提示已经存在x86的版本,此时采用如下方式

sudo dpkg -i --instdir=/home/jx/libs/freetype  libfreetype6_2.10.4+dfsg-1+deb11u1_arm64.deb

其中/home/jx/libs/freetype为自定义目录,安装完成后,其.so文件会在/home/jx/libs/freetype/usr/lib/aarch64-linux-gnu中。将其中的.so文件拷贝到/usr/aarch64-linux-gnu/lib中。

若提示

ld: cannot find -lfreetype 

则还是软链接的问题,新建一个libfreetype.so的软链接,链接到libfreetype.so.6.17.4

  1. 安装libasound

提示

ld: cannot find -lasound

表示没有aarch64架构下的libasound库,其操作如上述库的安装。注意最后使用libasound.so的软链接。

然后在openjdk源码目录下创建一个config.sh文件

#!/bin/bash
bash ./configure \
  --openjdk-target=aarch64-linux-gnu \
  --with-tools-dir=/usr/bin \
  --with-debug-level=release \
  --disable-warnings-as-errors \
  --x-includes=/usr/aarch64-linux-gnu/include \
  --x-libraries=/usr/aarch64-linux-gnu/lib \
  CC=aarch64-linux-gnu-gcc-7 \
  CXX=aarch64-linux-gnu-g++-7

运行

bash config.sh

执行

make CONF=linux-aarch64-normal-server-release images

网站公告

今日签到

点亮在社区的每一天
去签到