1. 程式人生 > >linux 編譯openjdk失敗記

linux 編譯openjdk失敗記

  • 最近開始學習jvm虛擬機器的知識,第一章就是自己編譯一個openjdk,結果編譯時遇到一個問題,嘗試了好久都沒能解決,心累的不想再試了。所以打算先繼續往下學習,等以後如果有毅力再來試一試,另寫下這篇部落格謹記錄自己編譯openjdk失敗了的過程和遇到的錯誤。

一、安裝linux系統


  • 首先我是在windows平臺上操作的,所以得先安裝虛擬機器軟體VMware,安裝教程百度。linux映象我來選擇的是ubuntu-14.04.5,安裝教程百度。由於編譯openjdk需要用到root的許可權,建議先獲取root許可權(教程:https://blog.csdn.net/u014296316/article/details/82120341

二、下載編譯原始碼openjdk


三、配置編譯環境


  • 編譯openjdk你需c++的編譯環境和jdk的編譯環境,至於為什麼需要安裝以下軟體我完全一臉懵逼,對c++的環境也完全不理解,也以至於遇到的那個問題查出是什麼問題也也解決不了。廢話不多說,安裝如下:
  • 首先開啟終端(Crtl+Alt+T),以root賬戶進行操作

1.安裝gcc、g++、make等

sudo apt-get install build-essential    

2.安裝XRender

sudo apt-get install libxrender-dev
sudo apt-get install xorg-dev

3.安裝alsa

sudo apt-get install libasound2-dev (daozhe)

4.Cups

sudo apt-get install libcups2-dev

5.安裝零碎的工具包

sudo apt-get install gawk zip libxtst-dev
libxi-dev libxt-dev

6.關於安裝ant與jdk

//自己的安裝路徑
export JAVA_HOME=/opt/jdk1.6.0_45
// 在檔案最後新增ant環境
export ANT_HOME=/opt/ant

// 並把jdk,ant環境新增到path中
export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH
  • 也可以如上自動安裝ant和jdk
sudo apt-get install openjdk-6-jdk
sudo apt-get install ant

四、編寫測試指令碼


  • 這是我那不成氣候,看不明白,東拼西湊的shell指令碼,如果看出什麼錯誤希望不吝賜教
  • 指令碼檔案以.sh格式結尾,然後在終端,選擇到該檔案所在的目錄,以./xxx.sh方式執行該指令碼
#!/bin/bash
#export LANG=C ALT_BOOTDIR=/opt/jdk1.6.0_45

#export -n JAVA_HOME
#export ALT_JDK_IMPORT_PATH=/opt/openjdk
#export ALT_OUTPUTDIR=/home/ubnutu64/Downloads/test
#make sanity BUILD_JAXWS=false BUILD_JAXP=false


cd /opt/openjdk
# export ALT_BOOTDIR
export LANG=C ALT_BOOTDIR=/opt/jdk1.6.0_45
# set build profile,first 'chmod +x jdk_generic_profile.sh'
jdk/make/jdk_generic_profile.sh
# disable JAVA_HOME
export -n JAVA_HOME
# export ALT_JDK_IMPORT_PATH
export ALT_JDK_IMPORT_PATH=/opt/openjdk
export ALT_DROPS_DIR=/opt/openjdk/drop
# start build
export ALLOW_DOWNLOADS=true

#把它設定為FALSE可以避免javaws和瀏覽器Java外掛之類的部分build  
BUILD_DEPLOY=false

#把它設定為false就不會build出安裝包。因為安裝包裡有一些奇怪的依賴  
#但即便不build出它也已經得到完整的JDK映象,所以還是不用build它  
BUILD_INSTALL=false  
#存放編譯結果  
export ALT_OUTPUTDIR=/opt/openjdk/build

make DEBUG_NAME=all_fastdebug
#make DEBUG_NAME=all_fastdebug BUILD_JAXWS=false BUILD_JAXP=false

五、編譯遇到的問題及解決方式


1./usr/local/openjdk7-debug/jaxws/build/xml_generated/build-drop-jaf_src.xml:96: Redirection detected from https to http. Protocol switch unsafe, not allowed.

  • 原因:是jdk7-jaf-2010_08_19.zip這個包下載不了導致的
  • 解決方案
將以下三個檔案下載後置於OpenJDK解壓後根目錄下的drop目錄下,

並在環境變數中加入配置:export ALT_DROPS_DIR=/usr/local/src/openjdk7/drop # 注意目錄Path

jdk7-jaf-2010_08_19.zip,下載地址:https://netix.dl.sourceforge.net/project/jdk7src/input-archives/jdk7-jaf-2010_08_19.zip

jdk7-jaxws2_2_4-b03-2011_05_27.zip,下載地址:http://download.java.net/glassfish/components/jax-ws/openjdk/jdk7/jdk7-jaxws2_2_4-b03-2011_05_27.zip

jaxp145_01.zip,下載地址:http://download.java.net/jaxp/1.4.5/jaxp145_01.zip

2.java.lang.RuntimeException: time is more than 10 years from present

  • 原因:openjdk的部分設定時間超時
  • 解決方案:
修改(openjdk下的目錄)jdk/src/share/classes/java/util/CurrencyData.properties,將裡面日期改為距當前日期內的十年以內的日期。
有108439529555等行

3./opt/openjdk/hotspot/src/share/vm/runtime/interfaceSupport.hpp:430:0: error: “__LEAF” redefined [-Werror]

  • 問題:在linux的標頭檔案cdefs.h裡,有個__LEAF的巨集,這個和hotspot/src/share/vm/runtime/interfaceSupport.hpp這個標頭檔案中的巨集定義有衝突
  • 解決方案:
在interfaceSupport.hpp檔案例增加一個#undef __LEAF 的定義

4./openjdk/hotspot/src/share/vm/oops/constantPoolOop.cpp:272:39: error: converting ‘false’ to pointer type ‘methodOop’ [-Werror=conversion-null]

  • 問題:返回值型別問題
  • 解決方案:
有兩個解決方法,一個是加上強轉型別,另一個是返回NULL
1 return (methodOop)false;
2 return NULL;

5.openjdk/hotspot/src/share/vm/opto/loopnode.cpp:896:50: error: converting ‘false’ to pointer type ‘Node*’ [-Werror=conversion-null]
* 原因:同第四點一樣
* 解決方案:

loopnode.cpp檔案內找到該句
if (cpool->cache() == NULL)  return false;  // nothing to load yet
並改為
if (cpool->cache() == NULL)   return NULL

6.未解決錯誤

  • 最後就卡在這裡,查不到解決方案
/opt/openjdk/build/tmp/sun/javax.sound/jsoundalsa/obj64/PLATFORM_API_LinuxOS_ALSA_Ports.o: In function `setRealVolume':
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xe2b): undefined reference to `snd_mixer_selem_get_playback_volume_range'
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xe66): undefined reference to `snd_mixer_selem_set_playback_volume'
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xe79): undefined reference to `snd_mixer_selem_get_capture_volume_range'
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xeb0): undefined reference to `snd_mixer_selem_set_capture_volume'
/opt/openjdk/build/tmp/sun/javax.sound/jsoundalsa/obj64/PLATFORM_API_LinuxOS_ALSA_Ports.o: In function `PORT_SetIntValue':
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xc3b): undefined reference to `snd_mixer_selem_set_capture_switch_all'
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xc4a): undefined reference to `snd_mixer_selem_set_playback_switch_all'
collect2: error: ld returned 1 exit status
make[5]: *** [/opt/openjdk/build/lib/amd64/libjsoundalsa.so] Error 1
make[5]: Leaving directory `/opt/openjdk/jdk/make/javax/sound/jsoundalsa'
make[4]: *** [build] Error 1
make[4]: Leaving directory `/opt/openjdk/jdk/make/javax/sound'
make[3]: *** [all] Error 1
make[3]: Leaving directory `/opt/openjdk/jdk/make/javax'
  • 補充:大概就記得有這些錯誤了,大部分都能百度得到解決,除了最後一個錯誤,如果有大神知道希望不吝賜教,本人萬分感激