概述
最近学习jvm,于是想着编译一个jdk版本,跨平台编译相当繁琐,编译器不同,语言环境不同(configure默认的英文),一路走来跌跌撞撞,终于编译成功,总结一下心得和过程。
更新:Visual Studio 2019的解决方案
++1:修改configure
进入openjdk目录,修改文件
build.configure-supportgenerated-configure.sh
找到
VS_DESCRIPTION_2017="Microsoft Visual Studio 2017"
VS_VERSION_INTERNAL_2017=141
VS_MSVCR_2017=vcruntime140.dll
VS_MSVCP_2017=msvcp140.dll
VS_ENVVAR_2017="VS150COMNTOOLS"
VS_USE_UCRT_2017="true"
VS_VS_INSTALLDIR_2017="Microsoft Visual Studio/2017"
VS_EDITIONS_2017="BuildTools Community Professional Enterprise"
VS_SDK_INSTALLDIR_2017=
VS_VS_PLATFORM_NAME_2017="v141"
VS_SDK_PLATFORM_NAME_2017=
VS_SUPPORTED_2017=true
修改以下条目:
VS_DESCRIPTION_2017="Microsoft Visual Studio 2019"
VS_VERSION_INTERNAL_2017=142
VS_ENVVAR_2017="VS160COMNTOOLS"
VS_VS_INSTALLDIR_2017="Microsoft Visual Studio/2019"
VS_VS_PLATFORM_NAME_2017="v142"
即可使用Visual Studio 2019参数了
2019的启动脚本可参照2017,修改为VS2019的vcvars目录即可。
++2:修改头文件
srcjava.desktopwindowsnativelibawtwindowsalloc.h
找到
#define malloc Do_Not_Use_malloc_Use_safe_Malloc_Instead
#define calloc Do_Not_Use_calloc_Use_safe_Calloc_Instead
#define realloc Do_Not_Use_realloc_Use_safe_Realloc_Instead
#define ExceptionOccurred Do_Not_Use_ExceptionOccurred_Use_safe_
ExceptionOccurred_Instead
全部注释掉(libawt中不允许使用这三个函数,另一个解决方法是替换掉相关cpp文件的调用,使用libawt提供的三个替代函数,然而工程浩大,暂时舍弃安全性)
这三个define使得标准头文件cstdlib中的malloc realloc calloc声明全部错误。
编译成功
成功的编译
系统:windows 10 专业版 1909
环境:
Oracle Java SE JDK 11
Visual Studio 2017
Windows SDK 10.0.18362.0
Cygwin
第一步:环境配置
环境配置是重中之重,坑多且杂,一个不行就是重装,要点如下:
1、必须安装Oracle JDK11以上作为bootstrap JDK。
OpenJDK在编译时需要用到已有的JDK作为启动,且OpenJDK12要求必须用11版本以上的JDK…
本人最初使用Ideal自带JDK环境,发现缺少部分组件,迫不得已重新下载(坑之一)
已解决
2、Visual Studio 版本不高于2017
OpenJDK无法识别VS2019安装目录
3、Visual Studio安装目录不能有空格和其他字符(建议英文+数字)
在configure过程中,需要找到MSVC的编译器cl,然而如果cl的目录存在空格,在脚本中会执行诸如
eval $CC ...
eval $c_compiler ...
之类的命令,会将cl目录的空格识别为命令分隔符(坑之三)
4、Windows10 SDK应从Visual Studio Installer安装,而不是手动安装。
5、Visual Studio应额外安装英文语言环境(默认为中文)或仅安装为英文版。
第二步:configure
1、启动Cygwin
进入Cygwin安装目录,配置启动脚本Cygwinvs64.bat
@echo off
rem 更改代码页
chcp 65001
rem cygwin的默认环境配置
setlocal enableextensions
set TERM=
rem VS环境变量
call "D:ProgramsVisualStudio2017VCAuxiliaryBuildvcvars64.bat"
cd /d "%~dp0bin" && .bash --login -i
其中VS目录改成安装目录即可
2、进入openjdk目录,修改文件
build.configure-supportgenerated-configure.sh
(此步可酌情修改,本人的机器会出现脚本结果问题,具体说明在踩坑记录中)
找到以下内容
WindowsSdkDir=$($ECHO "$WindowsSdkDir" | $SED 's/\\* *$//')
WINDOWSSDKDIR=$($ECHO "$WINDOWSSDKDIR" | $SED 's/\\* *$//')
if test "$WINDOWSSDKDIR" = " "; then
WINDOWSSDKDIR="$WindowsSdkDir"
fi
在fi前添加
elif test "$WINDOWSSDKDIR"=' ';then
WINDOWSSDKDIR="$WindowsSdkDir"
fi
4、执行命令
./configure 需要的编译选项(debug,server,client等) --with-boot-jdk="JDK11的目录"
第三步:make
make之前,首先应该修改一些文件
- testhotspotgtestutilitiestest_json.cpp
有一个雪花符号,查找并替换成任意符号,见踩坑记录 - /src/hotspot/share/compiler/methodMatcher.cpp
在void MethodMatcher::parse_method_pattern之后添加几行代码:
#pragma warning(disable: 4819)
#pragma warning(disable: 4778)
#pragma warning(disable: 4474)
- srcjava.desktopsharenativelibfreetypesrcautofitafblue.c
- srcjava.desktopsharenativelibfreetypesrcautofitafscript.h
- srcjava.desktopsharenativelibfreetypesrcsfntttload.c
保存为utf8 with bom 继续 - srcjava.desktopwindowsnativecommonawtsystemscalesystemScale.cpp
文件头使用
#pragma warning(disable: 4996)
最后
make images
即可
踩坑记录
powershell
cygwin
chcp 65001
否则编译器检测不通过(通过字符串匹配检测Compiler)
脚本有问题
openjdkbuild.configure-supportgenerated-configure.sh
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
# There is no specific version flag, but all output starts with a version string.
# First line typically looks something like:
# Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
COMPILER_VERSION_OUTPUT=`$COMPILER 2>&1 | $HEAD -n 1 | $TR -d 'r'`
此处COMPILER目录不能有空格
...
eval ac_try_echo=""$as_me:${as_lineno-$LINENO}: $ac_try_echo""
$as_echo "$ac_try_echo"
} >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
...
调试后发现ac_compiler路径带有空格,未找到任何解决办法,只得重新安装VS2017到一个不带空格目录的地方(同时安装的还有Windows SDK)
WindowsSdkDir=$($ECHO "$WindowsSdkDir" | $SED 's/\\* *$//')
WINDOWSSDKDIR=$($ECHO "$WINDOWSSDKDIR" | $SED 's/\\* *$//')
if test "$WINDOWSSDKDIR" = " "; then
WINDOWSSDKDIR="$WindowsSdkDir"
fi
此处WINDOWSSDKDIR为一个空格,等于说所有的版本失效
加上
elif test "$WINDOWSSDKDIR"=' ';then
WINDOWSSDKDIR="$WindowsSdkDir"
fi
解决了我的问题
最终configure成功
问题出自testhotspotgtestutilitiestest_json.cpp
编译过程出现特殊字符,保存为Utf8 with bom,无用,查找并替换☃字符为普通字符即可(因为是test的关系,没有处理的很谨慎,把⛄字符换成了一个字母‘T’)
/src/hotspot/share/compiler/methodMatcher.cpp
在void MethodMatcher::parse_method_pattern之后添加几行代码:
#pragma warning(disable: 4819)
#pragma warning(disable: 4778)
#pragma warning(disable: 4474)
jdk javadoc缺失
重装完整的jdk SE 11
libfreetype
srcjava.desktopsharenativelibfreetypesrcautofitafblue.c
srcjava.desktopsharenativelibfreetypesrcautofitafscript.h
srcjava.desktopsharenativelibfreetypesrcsfntttload.c
保存为utf8 with bom 继续
srcjava.desktopwindowsnativecommonawtsystemscalesystemScale.cpp
使用了废弃的函数
ID2D1Factory::GetDesktopDpi
使用
#pragma warning(disable: 4996)
最终,编译完成
最后
以上就是可耐大侠为你收集整理的OpenJDK 12 + Visual Studio 2019编译过程的全部内容,希望文章能够帮你解决OpenJDK 12 + Visual Studio 2019编译过程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复