test header

Ubuntu 20 下编译OpenJDK11

Ubuntu 下编译OpenJDK11

博主使用的Vmware虚拟机,Ubuntu 20.4 TLS 编译openJDK 11

win10 编译见博主另外一篇文章
https://www.cnblogs.com/xiaoye-2018/articles/15813470.html

  1. 下载OpenJDK 源码

    https://github.com/openjdk/jdk,版本:jkd 11.27 切换tag下载, 解压

    建议先阅读源码目录下doc/building.html编译文档, 形成一个良好的学习习惯

  2. 安装依赖环境

    一定得确保下面说有依赖都安装成功, 感觉输入的命令比Windos编译还多😂

    # 安装GCC环境
    apt-get install build-essential
    # 其他依赖
    apt-get install -y libfreetype6-dev
    apt-get install -y libcups2-dev
    # 这里貌似一起安装会失败,失败后自行一条一条输入
    apt-get install -y libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
    apt-get install -y libasound2-dev
    apt-get install -y libffi-dev
    apt-get install -y autoconf
    apt-get install libfontconfig1-dev
    

    由于编译JDK 需要一个版本号至少为N - 1的JDK做引导,因此还需要安装一个小版本的JDK

    apt-get install openjdk-10-jdk

  3. 解压下载的jdk源码

    unzip jdk.zip (如果没有unzip 命令需要使用 apt-get install unzip 进行安装)

  4. 配置编译参数

    ##进入jdk 源码目录
    cd jdk 
    ##设置configure执行权限 
    chmod +x configure
    ##设置编译参数 
    ##configure检查(注意前导jdk必须提前安装) 
    # 这几个参数意义: 指定编译64位虚拟机器、编译级别、关闭警告当错错误处理(这里尤其重要)
    # --with-boot-jdk: 这里是引导JDK 的路径,如果环境变量已经配置jdk10路径,这个参数可以省略
    bash ./configure --with-target-bits=64 --with-debug-level=slowdebug --disable-warnings-as-errors --with-boot-jdk=/usr/local/jdk...
    

    如果运行configuration 缺失依赖,会提示需要安装的依赖
    成功后会有如下提示信息:
    image-20211128164343303

  5. 成功后进行make

    输入:make images, 等待完成
    如果这里报下面的错误,说明gcc版本太高

       error: ‘readdir64_r’ is deprecated [-Werror=deprecated-declarations]
            while (readdir64_r(dirp, entry, &dp) == 0 && dp != NULL) {
            ^~~~~
       In file included from /usr/local/jdk/jdk-jdk-11+27/src/java.base/unix/native/lib                        java/TimeZone_md.c:36:0:
       /usr/include/dirent.h:201:12: note: declared here
        extern int readdir64_r (DIR *__restrict __dirp,
    

    降低GCC 版本,由于默认安装的GCC 版本为9, 官方文档推荐至少7.4, 版本太低不能工作,通过自己的验证太高也无法工作

    image-20211128214836560

    # 安装gcc 7, g++ 7
    sudo apt-get install gcc-7 g++-7
    # 更改默认版本, 100 表示优先级,最高的优先级会作为gcc默认的版本
    # 格式:update-alternatives --install <link> <name> <path> <priority>
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 50
    # 同样更改g++
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 50
    # 查看所选择的默认版本是否都为7
    sudo update-alternatives --config gcc
    sudo update-alternatives --config g++
    

    gcc、g++版本都是7时,才可以正常编译

  6. 重新编译

    先执行make clean清除原来生成的编译文件

    再次执行make images

    如果看到下面提示,则说明编译完成
    image-20211129100540656

    这里可能会出现下面错误信息
    fatal error: ld terminated with signal 9 [killed]

    这个问题主要是由于虚拟机的swap区内存不够导致, 机器性能好应该不会出现该问题
    image-20211128232811939

    查看swap内存, free -m,
    image-20211129085517691
    重新设置swap区域的内存

    cd /opt
    mkdir swap
    cd swap
    sudo dd if=/dev/zero of=swapfile bs=1024 count=3145728
    sudo mkswap swapfile
    sudo swapon swapfile
    

    free -m 命令查看下交换分区有没分配成功
    image-20211129090324103
    编译成功后,直接将opt 文件删除即可

  7. 查看编译的JDK

    进入:/build/linux-x86_64-normal-server-slowdebug/jdk/bin, 输入./java -version,

    可以看到11-internal 字样image-20211129101033186

  8. 调试jvm 可以使用vscode,也可以使用clion,没什么难度
    设置系统默认JDK

        update-alternatives --install /usr/bin/java java /usr/local/jdk/jdk-jdk-11+27/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java 1200
        update-alternatives --config java
    

image-20211129144950808

image-20211129145016401

  1. VS Code 调试

这个文章是很久之前写的,具体过程我也没记录太详细,见谅,相关教程可以搜索C++ 调试,大致都差不多

posted @ 2022-03-05 17:30  xiaoye-2018  阅读(417)  评论(2)    收藏  举报