我是靠谱客的博主 可耐大侠,最近开发中收集的这篇文章主要介绍OpenJDK 12 + Visual Studio 2019编译过程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近学习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编译过程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部