Windows 10 下編譯 64 位 OpenJDK 8
軟件版本
- 操作系統:Windows 10
- Cygwin:3.5.4-1
- Visual Studio:2010 英文版
- freetype: 2.7
- Boot JDK:7
-
編譯的 OpenJDK 版本:8
安裝 boot JDK
從下載鏈接下載 JDK,然後在 Windows 上安裝。安裝完成後配置 JAVE_HOME 環境變量,如下圖所示:
在已有的 Path 環境變量加入 %JAVA_HOME%\bin ,如下圖所示:
配置完成後在 cmd 中執行 java -version 命令,可以看到對應的版本信息,則證明已配置好,如下圖所示:
## 安裝 Cygwin
從下載鏈接下載安裝程序,然後在 Windows 上安裝。
設置安裝的路徑,這裏設置的是 E:\cygwin64,如下圖所示:
選擇要額外安裝的命令,包括:binutils,cpio,m4,make,procps-ng,unzip,zip。
選擇安裝 binutils 命令,如下圖所示:
選擇安裝 cpio 命令,如下圖所示:
選擇安裝 m4 命令,如下圖所示:
選擇安裝 make 命令,如下圖所示:
選擇安裝 procps-ng 命令,如下圖所示:
選擇安裝 unzip 命令,如下圖所示:
選擇安裝 zip 命令,如下圖所示:
安裝完成後在已有的 Path 環境變量加入 E:\cygwin64\bin 路徑,如下圖所示:
安裝 VS 2010
從下載鏈接下載 VS 2010 英文版(這裏一定要用英文版),然後在 Windows 上安裝。
安裝的時候設置安裝路徑,注意路徑中不能有空格,如下圖所示:
安裝的特性只需要勾選 Visual C++,如下圖所示:
在已有的 Path 環境變量加入 E:\MicrosoftVisualStudio10.0\VC\bin 路徑,如下圖所示:
下載並編譯 freetype
從下載鏈接下載 freetype 源碼並解壓。
然後打開 VS 2010,點擊 File->Open->Project/Solution,選擇 freetype 解壓路徑下的 builds\windows\vc2010\freetype.sln 文件並打開,如下圖所示:
右鍵後點擊 Properties,如下圖所示:
配置編譯成靜態鏈接庫,選擇 Configuration 為 Release Multithreaded,Platform 選擇 x64, Target Name 修改為 freetype,Target Extension 修改為 .lib,Configuration Type 修改為 Static libraty(.lib),如下圖所示:
點擊 Build-> Build Solution 編譯靜態鏈接庫,編譯完成後在 freetype 解壓路徑下的 objs\vc2010\x64 目錄下會生成 freetype.lib 文件,如下圖所示:
配置編譯靜態鏈接庫,主要是 Target Extension 修改為 .dll,Configuration Type 修改為 Dynamic Library(.dll),如下圖所示:
點擊 Build-> Build Solution 編譯動態鏈接庫,編譯完成後在 freetype 解壓路徑下的 objs\vc2010\x64 目錄會生成 freetype.dll 文件,如下圖所示:
然後在 freetype 解壓路徑下創建 lib 目錄,把 freetype.lib 和 freetype.dll 兩個文件拷貝到這個 lib 目錄下,如下圖所示:
下載並編譯OpenJDK 8
從下載鏈接下載 OpenJDK 8 的源碼並解壓。如果你使用的軟件版本和本文的軟件版本一致,則推薦下載替換文件 替換到解壓後相對應的目錄下,不然編譯的時候會遇到報錯。不一致的話則手動修改解壓後的文件,見後面的編譯遇到的問題及解決辦法。
在 OpenJDK 8 的解壓路徑下執行 ./configure --with-freetype='/cygdrive/e/freetype-2.7' --with-target-bits=64 --enable-debug -disable-ccache 命令,其中 --with-freetype 替換為實際的 freetype 的路徑,執行成功後的提示如下圖所示:
然後執行 make all 命令開始編譯,等待編譯結束,編譯成功後會在 OpenJDK 8 解壓路徑下的build 目錄生成 windows-x86_64-normal-server-fastdebug 目錄,編譯後的 JDK 就在這個目錄下,如下圖所示:
進入到 build\windows-x86_64-normal-server-fastdebug\jdk\bin 目錄,執行 java -version,就可以看到輸出如下圖所示:
這個時候就擁有了一個在自己電腦上編譯出來的 JDK 8 了。
編譯遇到的問題及解決辦法
Your cygwin is too old
執行 ./configure --with-freetype='/cygdrive/e/freetype-2.7' --with-target-bits=64 --enable-debug -disable-ccache 命令後可能會遇到報錯提示: Your cygwin is too old.,如下圖所示:
這個是因為 OpenJDK 8 解壓路徑下的 common\autoconf\generated-configure.sh 腳本有 Bug ,這個腳本中把 Cygwin 的版本寫死了,確保你的版本大於 1.7 之後,把這裏的版本修改為你自己的版本號即可。如果你的版本和本文使用的版本一致,則直接可以下載替換文件後替換即可,如下圖所示:
time is more than 10 years from present
執行 make all 命令後,可能會遇到報錯提示: time is more than 10 years from present,如下圖所示:
這個是因為 OpenJDK 8 解壓路徑下的 jdk\make\src\classes\build\tools\generatecurrencydata\GenerateCurrencyData.java 這個類中校驗了不能超過 10 年。可以手動將這裏的 10 修改為 100, 或者直接可以下載替換文件後替換即可。替換完成後執行 make clean 命令清理,然後再執行 make all 命令,如下圖所示:
images-only
執行 make all 命令後,可能會遇到報錯提示: Main.gmk:136: images-only] Error 2 ,如下圖所示:
這個是因為 OpenJDK 8 解壓路徑下的 jdk\make\CreateJars.gmk 文件有兩處地方少了回車符號,如下圖所示:
可以手動給這兩處增加回車符號,方法為在 insert 模式下,先按 Ctrl + V ,然後再按 Ctrl + M,或者直接可以下載替換文件後替換即可。替換完成後執行 make clean 命令清理,然後再執行 make all 命令編譯,如下圖所示:
編譯成功後輸出如下圖所示:
Windows 10 下單步調試 OpenJDK 8
創建調試項目
修改 OpenJDK 8 解壓路徑下的 hotspot\make\windows\create.bat 腳本中的內容,將腳本中默認的 cygwin64 的安裝路徑修改為實際的安裝路徑,如下圖所示:
進入到 VS 2010 安裝路徑下的 VC\bin\amd64,執行 vcvars64.bat,執行完成後不退出這個命令行,如下圖所示:
在同一個命令行進入到 OpenJDK 8 解壓路徑下的 hotspot\make\windows 目錄,執行 create.bat E:\jdk-jdk8-b120\jdk 命令創建 VS 2010 項目文件,如下圖所示:
配置單步調試
將 OpenJDK 8 解壓路徑下 build\windows-x86_64-normal-server-fastdebug\jdk\bin\java.diz 解壓到所在的路徑下,如下圖所示:
用 VS 2010 打開 OpenJDK 8 解壓路徑下的 hotspot\build\vs-amd64\jvm.vcxproj 文件,如下圖所示:
右鍵後點擊 Properties,配置 Debugging 參數,Configuration 選擇 compiler2_fastdebug,Platform 選擇 x64,Command 配置編譯出來的 java.exe ,Command Arguments 增加 -version 參數,這裏相當於就是配置執行 java -version 命令,Environment 配置 JAVA_HOME 為編譯出來的 JDK 路徑,如下圖所示:
配置完成後,按 F7 重新 build 一下項目,如下圖所示:
在 OpenJDK 8 解壓路徑下 share/vm/runtime/arguments.cpp 中的 init_system_properties() 打個斷點,如下圖所示:
點擊調試按鈕後,代碼在斷點處停下,如下圖所示:
單步調試遇到的問題及解決辦法
創建調試項目報錯
執行 create.bat 腳本報如下錯誤:
The code execution cannot proceed because mspdb 100.dll was not found. Reinstalling the program may fix this problem.
是因為沒有在同一個命令行執行 vcvars64.bat 見 創建調試項目
單步調試報錯
點擊 Debug 按鈕啓動調試報錯如下:
'java.exe': Loaded 'E:\openjdk8\openjdk\build\windows-x86_64-normal-server-fastdebug\jdk\bin\java.exe', Symbols loaded.
'java.exe': Loaded 'C:\Windows\System32\ntdll.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\kernel32.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\KernelBase.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\apphelp.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\advapi32.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\msvcrt.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\sechost.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\rpcrt4.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\user32.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\win32u.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\gdi32.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\gdi32full.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\msvcp_win.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\ucrtbase.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.1110_none_60b5254171f9507e\comctl32.dll', Cannot find or open the PDB file
'java.exe': Loaded 'C:\Windows\System32\imm32.dll', Cannot find or open the PDB file
The thread 'Win64 Thread' (0x1048) has exited with code 4 (0x4).
The thread 'Win64 Thread' (0x1efc) has exited with code 4 (0x4).
The program '[2308] java.exe: Native' has exited with code 4 (0x4).
這個需要重新 build 一下項目,見配置單步調試
參考
Win10下編譯OpenJDK8
Windows10下編譯openjdk8
編譯openjdk && 調試java
Windows10下vs2010單步調試jvm
Java虛擬機原理分析之Win7下VS2010編譯OpenJDK8與單步調試HotSpot VM過程詳細記錄
building open jdk 8