有關VirtualBox的介紹請參考:VirtualBox_百度百科
由於VirtualBox官網提供的搭建方法不夠詳細,而且本人在它指導下,從下載所需的開發包,到最后生成二進制文件,中間遇到了許多的問題,官網都沒有提供任何講解,我通過在網上查找、自己摸索,最后終於成功編譯生成了。以下本文僅提供Windows 32位下的VirtualBox開發環境搭建方法。
我的開發環境是:
Windows XP SP3
Visual Studio 2010 SP1
VirtualBox 4.2.8
1.准備所需開發包
(1) Visual Studio 2010 SP1
按照官方給的說明(https://www.virtualbox.org/wiki/Windows%20build%20instructions),下載所需的開發庫,其中Visual Studio 2010 SP1安裝好后,Windows Platform SDK v7.1就不用下載了;
(2) WDK v7.1
Windows Driver Development Kit (WDK) v7.1.按要求下載;
(3) MingW
MingW先下載前兩個(gcc-core-3.3.3、gcc-g++-3.3.3),后面的3個不用下載,只需點第一個(Runtime),會跳轉到一個頁面,提示:“Looking for the latest version? Download mingw-get-inst-20120426.exe (662.7 kB)”,點擊它下載安裝,安裝完后,將剛才下載的gcc-core與gcc-g++解壓,並覆蓋到安裝完的MingW路徑中,MingW就算准備完成;
(4) Qt4
下載Qt4,會很大,其實只需用到里面的bin、include、lib、src文件夾;
(5) cURL
再下載cURL,注意要下載devel的無SSL版本;
(6) SDL、zlib
剩下的SDL、zlib按要求下載,有開發版的就下開發版;
(7) openssl 0.9.8x
然后是下載openssl,記着一定要下載0.9.8x版本,太新的版本在后面編譯會出問題,我下的是0.9.8y版本。安裝openssl需要下載perl,我下載的是ActivePerl。
執行Visual Studio Command Prompt (2010),轉到openssl源碼的根目錄,執行命令:
perl Configure VC-WIN32
執行完后會提示“Configured for VC-WIN32.” 然后執行命令:
ms\do_ms
然后是執行命令進行openssl編譯:
nmake -f ms\ntdll.mak
如果沒有問題,openssl則安裝完畢。這時,需要手動創建include、bin、lib供后面VitualBox編譯時使用。將openssl中的include文件夾改名為其它名字,再將inc32重命名為“include”,然后創建bin、lib兩個文件夾,將out32dll文件夾中所有的*.lib文件復制到lib文件夾,再將所有*.exe、*.dll文件復制到bin文件夾。到此,openssl開發庫准備完畢。
(8) Python 2.7.3
最后是要下載python 2.7.3,在后面編譯時會用到。最好下載2.7版本,其它版本在后面編譯時會有奇怪的錯誤。
2.編譯VirtualBox
執行Visual Studio Command Prompt (2010),轉到virtualbox源碼的根目錄。執行命令:
cscript configure.vbs --with-MinGW32=C:\VirtualBox\VBoxLib\MinGW --with-libSDL=C:\VirtualBox\VBoxLib\SDL --with-openssl=C:\VirtualBox\VBoxLib\openssl --with-libcurl=C:\VirtualBox\VBoxLib\libcurl --with-Qt4=C:\VirtualBox\VBoxLib\qt
如果沒有錯誤,會出現兩個文件:AutoConfig.kmk、env.bat。執行命令:
env.bat
再執行命令進行編譯:
kmk
此時,kmk會按順序把VirtualBox中的源碼進行編譯和鏈接,在此過程中會出現一些問題,下面針對這些問題一一進行修正,修正完后,再執行kmk命令,就可以生成VirtualBox的所有二進制文件了。
(1)
報錯信息:
當執行kmk之后,如果程序停下來並有如下提示:
kmk: *** Waiting for unfinished jobs.... kmk: *** Exiting with status 2
說明編譯遇到了問題,查找上面第一個出現“error”的地方,可以看到這一行:
C:\VirtualBox\VirtualBox-4.2.8\src\VBox\Disassembler\DisasmCore.cpp : error C2220: warning treated as error - no 'object' file generated
解決方法:
這是因為源碼DisasmCore.cpp文件中的內容編碼不正確導致的,只需使用Windows自帶的記事本notepad.exe打開此文件,選擇菜單欄“文件”-->“另存為”,在“另存為”對話框的最下面“編碼”處選擇“Unicode”,並保存即可。然后再執行kmk命令,剛才出現的錯誤就沒有了。以下還會出現類似的錯誤,用這個方法解決即可。下面我把所有要修正的內容都列出來,全部修正之后再執行kmk命令吧:
(2)
報錯信息:
kBuild: Generating python - C:/VirtualBox/VirtualBox-4.2.8/out/win.x86/release/obj/VBoxOGLgen/spu_dispatch_table.h kmk_redirect.exe: error: _spawnvp(_P_WAIT, "python-not-found.exe", ...) failed:No such file or directory
解決方法:
首先復制之前安裝的Python的安裝路徑,然后在VirtualBox源碼根目錄的Makefile.kmk文件中添加一行:
VBOX_BLD_PYTHON=C:\Python27\python.exe
(3)
報錯信息:
C:\VirtualBox\VirtualBox-4.2.8\include\VBox/vmm/hwacc_vmx.h(773) : error C2220:warning treated as error - no 'object' file generated
解決方法:
像上面(1)所說明的方法以Unicode編碼重新保存文件即可。
(4)
報錯信息:
C:\VirtualBox\VirtualBox-4.2.8\src\VBox\VMM\VMMAll\SELMAll.cpp : error C2220: warning treated as error - no 'object' file generated
解決方法:
像上面(1)所說明的方法以Unicode編碼重新保存文件即可。
(5)
報錯信息:
kBuild: Compiling VBoxMMRHook - C:/VirtualBox/VirtualBox-4.2.8/src/VBox/Additions/WINNT/VBoxMMR/logging.cpp
kmk: *** No rule to make target `C:/VirtualBox/VirtualBox-4.2.8/tools/win.x86/sdk/v7.1/Lib/WS2_32.lib', needed by `C:/VirtualBox/VirtualBox-4.2.8/out/win.x86/release/obj/VBoxMMRHook/VBoxMMRHook.dll'. Stop.
解決方法:
在VirtualBox源碼中,找到這個路徑下的Makefile.kmk文件:C:\VirtualBox\VirtualBox-4.2.8\src\VBox\Additions\WINNT\VBoxMMR\Makefile.kmk,將里面第62行、第63行的這兩行內容注釋掉,在前面添加“#”即可:
#VBOX_PATH_PSDK_v71 := \ # $(PATH_DEVTOOLS)/win.x86/sdk/v7.1
並且添加這一行內容:
VBOX_PATH_PSDK_v71 := $(PATH_SDK_WINPSDK71)
(6)
報錯信息:
C:\VirtualBox\VirtualBox-4.2.8\src\VBox\Main\testcase\tstGuestCtrlParseBuffer.cpp(92) : error C2017: illegal escape sequence C:\VirtualBox\VirtualBox-4.2.8\src\VBox\Main\testcase\tstGuestCtrlParseBuffer.cpp(92) : error C2146: syntax error : missing '}' before identifier '漩f漩' C:\VirtualBox\VirtualBox-4.2.8\src\VBox\Main\testcase\tstGuestCtrlParseBuffer.cpp(92) : error C2146: syntax error : missing '}' before identifier '漩f漩' C:\VirtualBox\VirtualBox-4.2.8\src\VBox\Main\testcase\tstGuestCtrlParseBuffer.cpp(92) : error C2146: syntax error : missing ';' before identifier '漩f漩' C:\VirtualBox\VirtualBox-4.2.8\src\VBox\Main\testcase\tstGuestCtrlParseBuffer.cpp(92) : error C2143: syntax error : missing ';' before 'constant' ……
解決方法:
用Visual Studio打開文件VirtualBox-4.2.8\src\VBox\Main\testcase\tstGuestCtrlParseBuffer.cpp,按“Ctrl + G”定位到第92行,可以看到,在這些亂碼中缺少了兩個引號,加上使得語法正確即可:
原先:
改之后:
(7)
報錯信息:
c:\virtualbox\virtualbox-4.2.8\src\vbox\devices\testcase\../PC/DevLPC.cpp : error C2220: warning treated as error - no 'object' file generated
解決方法:
像上面(1)所說明的方法以Unicode編碼重新保存文件即可。
以上就是需要修正的問題,這時執行kmk命令,大概需要20分鍾左右的時間,就可以生成VirtualBox的全部二進制文件,如果編譯鏈接沒有出錯的話,最后kmk的輸出如下圖:
並且在VirtualBox源碼根目錄會生成“out”文件夾,大概有2.78G的大小,VirtualBox.exe執行文件就在“VirtualBox-4.2.8\out\win.x86\release\bin”中。
3.執行VirtualBox
在執行VirtualBox.exe之前,需要把運行時需要的dll庫復制到與VirtualBox.exe同一路徑或system32下,包括以下文件:
然后,需要執行VirtualBox.exe同一路徑中的兩個命令:“comregister.cmd”、“loadall.cmd”,其中,“loadall.cmd”必須要在“Visual Studio Command Prompt (2010)”命令行中運行,執行過程中會安裝虛擬機網絡驅動,如下圖所示:
最后,就可以正常運行我們自己編譯的VirtualBox.exe啦: