在上一篇文章《Java虚拟机原理分析之Win7下VS2010编译OpenJDK8与单步调试HotSpot VM过程详细记录》中,我们在Win7+VS2010环境下成功编译出了x86版本的OpenJDK。然而VS2010毕竟有些年头了,我也只是在开发机上才装了这个经典的VS版本,而在自己的电脑上使用的是VS2017。而通过远程桌面连到开发机是一件很不爽的事,并且VS2010的IDE自然是不如VS2017的好用。因此萌发了使用VS2017编译OpenJDK的想法,然而经过搜索并没能在网上找到类似的文章和教程,于是只得靠自己摸索了。
首先放上我的环境信息:
Microsoft Windows 10 LTSB 2016版本(补丁更新到最新)
Visual Studio 2017(补丁更新到最新,装有VisualAssistX插件)
JDK Win64 8u152版本
Cygwin x64版本,已装好了需要的组件
freetype 2.81版本,已用VS2017编译好x86的Dll版本,放在I:\jvm\freetype目录下
OpenJDK v8源码最新版本,放在I:\jvm\jdk8u-dev目录下
msvcr100.dll的x86版本(只是用来骗配置过程的),放在I:\jvm\目录下
由于之前已经详细记录过Win7下使用VS2010编译x86版本OpenJDK的过程了,因此这里对于重复部分就不再详细讲解了,直接一句话带过,如有需要可以参考上一篇文章中的详细记叙。
配置
解决找不到VS的问题
下载好源码、安装好Cygwin及工具并编译生成dll版本的typefree(这部分操作与VS2010编译时一致,在此不再赘述),然后使用如下命令:
bash ./configure --with-freetype=/cygdrive/i/jvm/freetype -with-target-bits=32 --with-debug-level=slowdebug --with-jvm-variants=client
接着在寻找VS时会报错:
打开/common/autoconf/generated-configure.sh文件,搜索“Cannot locate a valid Visual Studio”进行定位,发现可以通过传入–with-tools-dir参数指定vcvars32.bat的路径,从而定位到头文件、库文件等的路径。针对VS2017,该批处理位于以下路径:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build
修改代码,主要匹配其vcvars32.bat和VS100BASE路径。值得注意的是,VS2017默认的vcvars32xp.bat没有包含WinSDK 7.1,并且生成的可执行文件也无法在XP上运行。因此拷贝vcvars32.bat为vcvars32xp.bat,修改其内容如下:
@call "%~dp0vcvarsall.bat" x86 %*
set INCLUDE=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Include;%INCLUDE%
set PATH=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Bin;%PATH%
set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Lib;%LIB%
set CL=/D_USING_V110_SDK71_;%CL%
set LINK=/SUBSYSTEM:CONSOLE,5.01 %LINK%
然后对generated-configure.sh文件中的代码进行修改:
# First-hand choice is to locate and run the vsvars bat file.
if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then
VCVARSFILE="VC/Auxiliary/Build/vcvars32xp.bat" # 这里改为VS2017的路径
else
VCVARSFILE="VC/Auxiliary/Build/vcvars64.bat" # 这里改为VS2017的路径
fi
VS_ENV_CMD=""
VS_ENV_ARGS=""
if test "x$with_toolsdir" != x; then
if test "x$VS_ENV_CMD" = x; then
VS100BASE="$with_toolsdir/../../.." # 这里改为VS2017的路径
METHOD="--with-tools-dir"
修改后,重新输入配置命令如下:
bash ./configure --with-freetype=/cygdrive/i/JVM/freetype -with-target-bits=32 --with-debug-level=slowdebug --with-jvm-variants=client with_toolsdir="/cygdrive/c/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/VC/Auxiliary/Build"
执行后继续报错: