-------《C++編程思想》編程準則1:首先讓程式運行,然後追求速度。即使我們確定這一段程式非常重要,而且是我們系統中的瓶頸。不要最佳化,首先用儘可能簡單的設計使程式可以運行,如果速度不滿足要求,再對其進行分析。我們總是能夠發現“我們的”瓶頸並不是問題所在,節省我們的時間做真正有意義上的事。
OpenJDK的編譯
一 OpenJDK
OpenJDK是JDK的開放源碼版本,是java語言的發明公司Sun Microsystems. Inc,成立的一個開源項目。由於版本關係,導致openJdk原始碼不完整,所以它的功能要遠少於SUN JDK,不包含:Brower Plugin,Java web Start,以及java控制台,這些功能在OpenJDk中是找不到的,這些不能開往的原始碼,以外掛程式的形式提供給OpenJDK編譯時間使用,OpenJDK6的時候,Icedtea項目給它這些不完整的部分開發了相同功能的原始碼。開始和SunJDK一樣完整。另外注意的是,OpenJDK只包含最精簡的JDK,如果使用Icetea補丁的OpenJDK, openJDK 命令“java -version”顯示的不是OpenJDK,而是java.
二 安裝環境準備 本文選用的是在virtualbox中,使用ubuntu 14.04 32位版本鏡像,主系統是ubuntu 16.04 64位,為什麼我本來真機就是ubuntu ,還要安裝個虛擬機器。閑得慌。這個後面說。使用linux系統(ubuntu)進行構建,是相當方便的,天生具備各種工具鏈,如果使用window,要到處找c++編譯器,以及各種缺失的編譯所要的工具包和編譯環境,安裝一個普通jdk,或者openjdk到系統上,配置好JAVA_HOME,JRE_HOME,CLASSPATH。這是我的配置:
export JAVA_HOME=/opt/jdk export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib 為什麼要安裝一個新的JDK在機器上,後面有說。
三 安裝步驟 原始碼下載有兩種方式,A是直接下整包原始碼 B 使用OPENJDK 官方提供的工具Mercurial(hg)類似git進行下載
A 直接下整包原始碼,好處是快方便省事,不好的地方是看不到官方修改的release not.不過,還是建議用這種方式,因為B方式,有很多時候,是下載不下來的,不知道原因。
直接到網址:http://download.java.net/openjdk/jdk8/
B 使用Mercurial(hg).下載
OpenJDK的源檔案版本庫基於Mercurial(hg),它是一個與Git相似的分布式版本控制工具。在Ubuntu中安裝Mercurial只需要執行命令
---安裝版本管理工具
1) $ sudo apt-get install mercurial -y
---下載OpenJDK 架構
2) $ hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev/ jdk8-src
---進入架構目錄
3) $ cd jdk8-src
----OpenJDK的原始碼版本庫實際上包含多個獨立的子版本庫,需要執行如下指令碼去分別下載各個子版本庫的原始碼,
4) $ sh get_source.sh
# Repositories: corba jaxp jaxws langtools jdk hotspot nashorn
....
四 構建 1) 設定環境變數
首先,要說一下,構建openJDK要一個藥引,這個藥引叫boot jdk,這個工具一般已經整合在普通的jdk中了,所以,安裝一個普通的JDK到系統上,然後配置好環境變數就好。然後繼續在.bashrc 裡邊添加以下變數。
export USE_PRECOMPILED_HEADER=trueexport SKIP_DEBUG_BUILD=false export SKIP_FASTDEBUG_BUILD=true export DEBUG_NAME=debug export LANG=C unset CLASSPATH unset JAVA_HOME
2) 配置編譯環境 $ sh configure 或者 bash configure
該過程會檢測構建環境是否符合要求,如有問題,它會給出提示。比如,
configure: error: Could not find X11 libraries. You might be able to fix this by running 'sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev'.
後面可能,大部分還有繼續安裝的缺失的工具,都可以通過提示apt安裝即可。每次安裝完畢,再次重新執行上述configure命令,直到沒有報錯為止。不要使用apt安裝ccashe,ubuntu的軟體庫裡,這個軟體太舊了。
3) 安裝高速C/C++編譯工具(ccache) https://ccache.samba.org/
在處理一些規模相對較大的工程時,編譯花費的時間可能會很長。有時候我們會經常一遍一遍地編譯相同的程式,此時,有了ccache情況就好多了。它將在第一遍編譯時間多花幾秒鐘,但接下來就會使編譯成倍(5-10倍)的提速。
下載源碼包後,解壓縮,進入包。執行以下命令:
$./configure
$make
$make install
$sudo cp ccache /usr/local/bin/
$sudo ln -s ccache /usr/local/bin/gcc
$sudo ln -s ccache /usr/local/bin/g++
$sudo ln -s ccache /usr/local/bin/cc
$sudo ln -s ccache /usr/local/bin/c++
4) 回到openJDK源碼包內進行構建執行以下命令 $make all DEBUG_BINARIES=true
接下來就是慢長的等待,快的20分鐘,我的由於是虛擬機器,機器cpu又比較慢,用了40分鐘。
完成後,在當前路徑下會產生一個build目錄,構建好的JDK就在那裡面。新JDK的具體路徑類似於build/linux-x86-normal-server-release/jdk/bin。可以執行如下命令去測試這個JDK,這是我修改了JVM後,加入了自己的名字定製的,哈哈。
五 後記: 當時我的機器是ubuntu 16.04 64位,不論怎麼構建,都出錯,google了一下,沒有碰到中國人有說到過這問題,只發現2013年-2014年有幾個老外的貼提起過,其中是一個是debian系統的測試員,今天我還特地寫了信問他,不知道這個人離職沒有。。。。下面這個link是debian的bug系統裡那個問題,也是我碰到的問題。
https://lists.debian.org/debian-java/2014/05/msg00024.html
所以,最後,我只能在ubuntu 裡邊使用虛擬機器,重新安裝了一個32位的低版本的14.04,然後就沒問題了。可能是g++過高。
續:
後電腦重裝ubuntu 14.04 64位,全程無問題。看來編譯OpenJdk實在很挑剔環境。