之前面试的时候总是能碰到关于JVM的问题,这次下定决心研究一下。开篇的时候说是要编译一个openjdk,真不容易,折腾了大约有2-3天,其中走了一些弯路,参考的文章链接见底部,建议不用看他们的了,因为就是参考的太多,反而犯了一些错误,耽误了很长时间,钻进了思维死角里。废话少说,上干货。
编译环境说明
以上安装软件全部提供下载啦(都是官网下载的)。链接:链接: https://pan.baidu.com/s/14tGL5Jp5TZnCF7NcHQmq0Q 提取码: 86dr 复制这段内容后打开百度网盘手机App,操作更方便哦
软件安装
首先安装cygwin:这个是模拟Linux环境的软件,相当于一个虚拟机,主要编译工作在这里进行。
以下几类package是必须要安装的。
Binary Name | Category | Package | Description |
---|---|---|---|
ar.exe | Devel | binutils | The GNU assembler, linker and binary utilities |
make.exe | Devel | make | The GNU version of the ‘make’ utility built for CYGWIN |
m4.exe | Interpreters | m4 | GNU implementation of the traditional Unix macro processor |
cpio.exe | Utils | cpio | A program to manage archives of files |
gawk.exe | Utils | awk | Pattern-directed scanning and processing language |
file.exe | Utils | file | Determines file type using ‘magic’ numbers |
zip.exe | Archive | zip | Package and compress (archive) files |
unzip.exe | Archive | unzip | Extract compressed files in a ZIP archive |
free.exe | System | procps | Display amount of free and used memory in the system |
如图,默认都是default,选择需要必须要安装的点击那个如刷新的按钮,切换成install。我选择的ALL Install,装了多长时间我不知道,我是点完下一步就下班走人了,哈哈。
将cygwin的安装路径下bin目录配置到环境变量path中,如我的安装路径为:E:\DevTools\Cygwin\cygwin_install\bin
安装VS2010,这个安装过程我就省略了,但是要注意的是,安装路径不要有空格,因为以后你会用到它......
将下载的freetype2.7解压。如解压至E:\freetype-2.7
接下来介绍通过vs2010编译64位的freetype-2.7,至于freetype是干嘛的,请童鞋们自行百度搜索。
编译Freetype
为照顾没有使用过vs的同学,介绍一下编译的具体过程,第一次打开vs2010的话,选择使用VC++,选择file-->open-->project/solution...,找到你解压freetype的路径 ,如我的E:\freetype-2.7\builds\windows\vc2010\freetype.sln
打开后,右键项目,选择properties,如图
由于我们想编译64位的openjdk,所以我这里需要64位的,在编译之前的检查中,我们不仅需要dll文件还需要lib文件,都是用同一个工程编译出的只是后缀不太一样。编译两次的时候只需要修改vs2010的配置后缀就OK了,注意在vs2010的配置选中,选择X64的,编译的时候,请右键项目,build,请同学们注意下图:
编译freetype.lib:
编译freetype.dll
两个文件编译完成后,编译的文件在目录:E:\freetype-2.7\objs\vc2010\x64
然后咱们在E:\freetype-2.7目录下创建lib文件夹,并将编译好的freetype.dll和freetype.lib复制到该目录。
在编译openjdk之前会校验并用到freetype下的include文件夹下的ft2build.h和lib文件夹下的freetype.dll和freetype.lib文件。(后面会说到编译前的校验,会提到使用这几个文件的地方)
然后还需要设置一下freetype的环境变量,FREETYPE_CFLAGS=E:\freetype-2.7\include;FREETYPE_LIBS=E:\freetype-2.7\lib,可以尝试直接设置在path中。如图:
编译openjdk
打开cygwin,切换到解压的openjdk_8的文件夹根目录,如:
执行命令
bash ./configure -with-freetype=/cygdrive/e/freetype-2.7 -enable-debug -with-target-bits=64
-with-freetype参数是使用指定的freetype,-enable-debug是编译可调试的openjdk,-with-target-bits=64,是指编译64位的
然后就默默祈祷一切顺利吧,此时先开始了一些列的编译检查,你可以用文本编辑器看一下openjdk下面的configure的内容,它实际上指向了这个文件,E:\DevTools\openjdk\common\autoconf\generated-configure.sh,你可以发现这个文件中的各种编译前的校验
如果你看到下面这张图,congratulations,校验通过,可以真正的编译openjdk了
在校验阶段往往存在的坑有好几个,我这里只列举我碰到的,其他请参考别人的文章,
首先补充一下在win系统下需要freetype文件的校验问题,如果不设置freetype的路径,默认它会去C:\Program Files\GnuWin32路径下去找,如下图:
在编译过程中可能会报Target CPU mismatch,那是因为你用的中文版的VS2010编译的freetype的问题,我的使用的英文版的vs2010,没有出现这个问题,如果有请找到如下图的位置,进行屏蔽(可能有好几处,请自行搜索检查),
在编译过程中报如下的错误,请按图在generated-configure.sh文件中找到对应的信息进行屏蔽即可。
configure: Your cygwin is too old. You are running 2.10.0(0.325/5/3), but at least cygwin 1.7 is required. Please upgrade.
configure: error: Cannot continue
configure exiting with result code 1
在编译的过程中遇到的错误,你都可以根据错误信息在generated-configure.sh文件中进行搜索,看一看是哪个位置出现的错误,然后再思考解决的办法。
因为我参考了一篇专门编译freetype的文章,按照文章修改了一个.h的头文件,然后编出来的freetype.dll和freetype.lib在校验的时候总是报不是64位的,其实是文件应该有错误,所以不能进行编译,后来换了英文版的vs2010,打开工程什么文件都没有修改,直接设置了一下编译的配置,然后build出来文件就没有问题,在这个问题上纠结了一段时间,都是泪~~~。
接下来应该都编译通过,你可以通过make all命令进行下一步的工作,编译完的结果在E:\DevTools\openjdk\build\windows-x86_64-normal-server-fastdebug中。
参考文章:
https://blog.csdn.net/tangyongzhe/article/details/53576097
https://blog.csdn.net/yapingxin/article/details/51841039
https://blog.csdn.net/LPWSTR/article/details/78849587
感谢!