我在編譯中遇到的最大的問題就是gcc版本問題,因manjaro是滾動更新,是以gcc也是很新的版本,導緻無法編譯jdk11
1 下載下傳源碼
網上根據關鍵詞查找jdk源碼,查找出來很多可以下載下傳源碼的連結,這裡我們使用github去官方倉庫,openjdk是托管在github的OpenJDK組織下,該組織下有各個版本的openjdk源碼,不要直接使用jdk倉庫,這個倉庫存放的是目前正在開發的最新版本代碼,我們要用的是jdk11,是以我們搜尋jdk11倉庫,我這裡選擇的是jdk11u這個庫。

git clone https://github.com/openjdk/jdk11u.git
2 編譯
按照readme的文檔進行編譯
2.1 configure
首先執行進入源碼目錄,執行
bash configure
此指令會檢查編譯需要的環境,如果報錯,根據錯誤提示安裝必要的編譯工具。
注意事項:
- 安裝必要的環境,包括gcc、autoconf、boot JDK等
- 編譯一個jdk是需要依賴一個現有的jdk,另外對版本有要求,比如你編譯的版本是N,則需要你電腦上有一個版本至少為N-1的版本,這裡我編譯jdk11時,我電腦事先安裝了jdk11,理論上至少需要一個jdk10+
- gcc版本不能太老,也不能太新,這裡一定要看你目前版本對應的文檔,每個jdk版本對gcc版本要求也不一樣,新版本jdk肯定能相容更新的gcc,我在編譯jdk11時,因為我的manjro是滾動更新,gcc版本是12,結果太新了導緻編譯報錯。
bash configure
#……省略前邊若幹日志
#……
config.status: creating /home/chenkun/IdeaProjects/jdk11u/build/linux-x86_64-normal-server-release/buildjdk-spec.gmk
config.status: creating /home/chenkun/IdeaProjects/jdk11u/build/linux-x86_64-normal-server-release/compare.sh
config.status: creating /home/chenkun/IdeaProjects/jdk11u/build/linux-x86_64-normal-server-release/Makefile
====================================================
The existing configuration has been successfully updated in
/home/chenkun/IdeaProjects/jdk11u/build/linux-x86_64-normal-server-release
using default settings.
Configuration summary:
* Debug level: release
* HS debug level: product
* JVM variants: server
* JVM features: server: 'aot cds cmsgc compiler1 compiler2 epsilongc g1gc graal jfr jni-check jvmci jvmti management nmt parallelgc serialgc services vm-structs zgc'
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64
* Version string: 11.0.18-internal+0-adhoc.chenkun.jdk11u (11.0.18-internal)
Tools summary:
* Boot JDK: openjdk version "11.0.17" 2022-10-18 OpenJDK Runtime Environment (build 11.0.17+1) OpenJDK 64-Bit Server VM (build 11.0.17+1, mixed mode) (at /usr/lib/jvm/java-11-openjdk)
* Toolchain: gcc (GNU Compiler Collection)
* C Compiler: Version 12.2.0 (at /usr/bin/gcc)
* C++ Compiler: Version 12.2.0 (at /usr/bin/g++)
Build performance summary:
* Cores to use: 16
* Memory limit: 31876 MB
如上,執行
bash configure
後,檢查了環境包括Boot JDK,Toochain,C Compiler,C++ Compiler,這裡c和c++編譯器版本要一緻,可以看到上面我的版本是12.2.0,這個版本太新會導緻編譯有問題,在building文檔中也有說明,最新支援到7.4,更新的版本沒有測試,可能相容可能不相容。
2.2 執行編譯make images
make images
##省略中間若幹日志
/home/chenkun/IdeaProjects/jdk11u/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp:105:31: error: non-static data member initializers only available with '-std=c++11' or '-std=gnu++11' [-Werror=c++11-extensions]
105 | CgroupV1Controller* _pids = NULL;
... (rest of output omitted)
* For target hotspot_variant-server_libjvm_objs_cgroupV2Subsystem_linux.o:
In file included from /home/chenkun/IdeaProjects/jdk11u/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp:25:
/home/chenkun/IdeaProjects/jdk11u/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp:54:32: error: non-static data member initializers only available with '-std=c++11' or '-std=gnu++11' [-Werror=c++11-extensions]
54 | CgroupController* _unified = NULL;
| ^
/home/chenkun/IdeaProjects/jdk11u/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp:56:38: error: non-static data member initializers only available with '-std=c++11' or '-std=gnu++11' [-Werror=c++11-extensions]
56 | CachingCgroupController* _memory = NULL;
| ^
/home/chenkun/IdeaProjects/jdk11u/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp:57:35: error: non-static data member initializers only available with '-std=c++11' or '-std=gnu++11' [-Werror=c++11-extensions]
57 | CachingCgroupController* _cpu = NULL;
| ^
cc1plus: all warnings being treated as errors
* All command lines available in /home/chenkun/IdeaProjects/jdk11u/build/linux-x86_64-normal-server-release/make-support/failure-logs.
=== End of repeated output ===
No indication of failed target found.
Hint: Try searching the build log for '] Error'.
Hint: See doc/building.html#troubleshooting for assistance.
make[1]: *** [/home/chenkun/IdeaProjects/jdk11u/make/Init.gmk:305:main] 錯誤 2
make: *** [/home/chenkun/IdeaProjects/jdk11u/make/Init.gmk:186:images] 錯誤 2
以上編譯報錯了,根據搞錯大概也看出編譯器的版本最大隻能支援到11,是以我這裡需要安裝另一個版本的編譯器,這裡就展現arch系linux的缺點了,滾動版本太激進會導緻有的老軟體存在各種版本不相容。
2.3 解決編譯器gcc版本問題
使用yay安裝老版本的gcc,這裡我和文檔保持一緻,文檔說目前最新的已測試通過的版本是gcc7,這裡我就安裝gcc7:
$ yay gcc7
8 aur/armeb-none-eabi-gcc75-linaro-bin 7.5_2019.12-1 (+0 0.00)
The GNU Compiler Collection - cross compiler for ARM EABI (bare-metal) big-endian target.
7 aur/arm-none-eabi-gcc73-linaro 7.3_2018.05-1 (+0 0.00) (過時的: 2021-11-02)
The GNU Compiler Collection - cross compiler for ARM EABI (bare-metal) target.
6 aur/aarch64-linux-gnu-gcc75-linaro-bin 2019.12-1 (+0 0.00)
The GNU Compiler Collection - cross compiler for ARM64 target
5 aur/arm-linux-gnueabi-gcc75-linaro-bin 7.5.0-1 (+1 0.00)
The GNU Compiler Collection - cross compiler for ARM target
4 aur/arm-linux-gnueabihf-gcc75-linaro-bin 7.5-0 (+2 0.57)
The GNU Compiler Collection- cross compiler for ARMv7 EABI hard float target. (Linaro)
3 aur/gcc7-libs 7.5.0-4 (+15 0.02) (已安裝)
Runtime libraries shipped by GCC (7.x.x)
2 aur/gcc7-fortran 7.5.0-4 (+15 0.02)
Fortran front-end for GCC (7.x.x)
1 aur/gcc7 7.5.0-4 (+15 0.02) (已安裝)
The GNU Compiler Collection - C and C++ frontends (7.x.x)
==> 要安裝的包 (示例: 1 2 3, 1-3 或 ^4)
==>
如上,選擇第一個就行了,因為我已經安裝過了,是以顯示已安裝。
安裝好了以後,需要把預設的gcc改成7版本的。
##1. 檢視目前預設的gcc在哪裡
which gcc
/usr/bin/gcc
which g++
/usr/bin/g++
##2. 備份原來的12.2.0版本,編譯完jdk後還原,防止系統其他軟體出現問題
cd /usr/bin
sudo cp gcc gcc.bak
sudo cp g++ g++.bak
## 3. 把gcc7設為預設
sudo cp gcc-7 gcc
sudo cp g++-7 g++
設定預設gcc後,重新執行
bash configure
,然後
make clean
,然後再
make images
就成功了,編譯好的jdk預設在./build/linux-x86_64-normal-server-release/images/jdk