在win7 64位環(huán)境編譯 VirtualBox-5.0.0 OSE

最近因需要嘗試編譯了一次Vbox,官方論壇上只有32位環(huán)境的編譯教程,所以這次在64位、特別是中文環(huán)境上遇到不少坑。這里總結(jié)出來,希望對(duì)后面的人有幫助。

下載編譯所需工具

編譯所需工具可參考Windows build instructions
該地址為官網(wǎng)的編譯操作指南,寫得比較泛泛而談,簡(jiǎn)單參考一下即可。我編譯64位VBox用到的工具如下:

  1. Visual Studio 2010Visual Studio 2010 Service pack 1也就是sp1
  2. Windows Platform SDK v7.1
  3. Windows Driver Development Kit (WDK) v7.1
  4. MingW-w64
  5. Qt-4.7.3
  6. SDL-1.2.15
  7. cURL-7.49.1
  8. OpenSSL-1.0.1t
  9. ActivePerl
  10. Python 2.x
  11. VirtualBox 5.0.0

還有一些東西官網(wǎng)的操作指南有提到,但是不是必須的,在這里我沒有用到。

搭建編譯環(huán)境
  1. 安裝Windows Platform SDK
  2. 安裝WDK
  3. 安裝Visual Studio 2010
  4. 安裝Visual Studio 2010 Service pack 1
  5. 安裝python和ActivePerl
    最好在安裝VS2010之前安裝SDK和WDK,不然安裝時(shí)可能會(huì)出顯示.Net框架沖突的錯(cuò)誤。
開始編譯

從現(xiàn)在開始接下來一路是坑

解壓文件
  1. 新建一個(gè)Vbox的編譯目錄,如:E:\Vbox,將qt-everywhere-opensource-src-4.7.3,SDL-1.2.15,mingw64,openssl-1.0.1t,curl-7.49.1解壓到E\Vbox下。將openssl和curl復(fù)制一份,重命名為openssl-1.0.1t-86,openssl-1.0.1t-64,curl-7.49.1-86,curl-7.49.1-64
├─curl-7.49.1-64
│
├─curl-7.49.1-86
│
├─mingw64
│  
├─openssl-1.0.1t-64
│  
├─openssl-1.0.1t-86
│  
├─qt-everywhere-opensource-src-4.7.3
│  
├─SDL-1.2.15
│  
├─VirtualBox-5.0.0
編譯QT
  1. 將Qt目錄加入環(huán)境變量,如:E:\Vbox\qt-4.7.3\bin
  2. 開始菜單->所有程序->Microsoft Visual Studio 2010->Visual Studio Tools->Visual Studio x64 兼容工具命令提示(2010)
  3. 切換到Qt根目錄,如:E:\Vbox\qt-4.7.3
  4. 命令行輸入
set QMAKESPEC=E:\Vbox\qt-everywhere-opensource-src-4.7.3\mkspecs\win32-msvc2010 
configure -debug-and-release -opensource -platform win32-msvc2010
nmake
編譯OpenSSL-64
  1. 開始菜單->所有程序->Microsoft Visual Studio 2010->Visual Studio Tools->Visual Studio x64 兼容工具命令提示(2010)
  2. 切換到openssl-64目錄,如:E:\Vbox\openssl-1.0.1t-64
  3. 命令行輸入
perl Configure VC-WIN64A --prefix=E:\Vbox\openssl-1.0.1t-64\output
ms\do_win64a
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak install

編譯結(jié)果將輸出到 E:\Vbox\openssl-1.0.1t-64\output

編譯OpenSSL-86
  1. 開始菜單->所有程序->Microsoft Visual Studio 2010->Visual Studio Tools->Visual Studio 命令提示(2010)
  2. 切換到openssl-86目錄,如:E:\Vbox\openssl-1.0.1t-86
  3. 命令行輸入
perl Configure VC-WIN32 --prefix=E:\Vbox\openssl-1.0.1t-86\output
ms\do_ms
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak install

編譯結(jié)果將輸出到 E:\Vbox\openssl-1.0.1t-86\output

編譯cURL-64
  1. 開始菜單->所有程序->Microsoft Visual Studio 2010->Visual Studio Tools->Visual Studio x64 兼容工具命令提示(2010)
  2. 切換到cURL-64目錄,如:E:\Vbox\curl-7.49.1-64
  3. 命令行輸入
set OPENSSL_PATH=..\openssl-1.0.1t-64
pushd lib
nmake /f Makefile.vc10 cfg=release-dll MACHINE=x64

編譯結(jié)果將輸出到 E:\Vbox\curl-7.49.1-64\lib\release-dll

  1. 將E:\Vbox\curl-7.49.1-64\lib\release-dll\libcurl_imp.lib 重命名為 libcurl.lib
  2. 將E:\Vbox\curl-7.49.1-64\lib\release-dll\libcurl.lib和E:\Vbox\curl-7.49.1-64\lib\release-dll\libcurl.dll 復(fù)制到 E:\Vbox\curl-7.49.1-64
編譯cURL-86
  1. 開始菜單->所有程序->Microsoft Visual Studio 2010->Visual Studio Tools->Visual Studio 命令提示(2010)
  2. 切換到cURL-86目錄,如:E:\Vbox\curl-7.49.1-86
  3. 命令行輸入
set OPENSSL_PATH=..\openssl-1.0.1t-86
pushd lib
nmake /f Makefile.vc10 cfg=release-dll MACHINE=x86

編譯結(jié)果將輸出到 E:\Vbox\curl-7.49.1-86\lib\release-dll

  1. 將E:\Vbox\curl-7.49.1-86\lib\release-dll\libcurl_imp.lib 重命名為 libcurl.lib
  2. 將E:\Vbox\curl-7.49.1-86\lib\release-dll\libcurl.lib和E:\Vbox\curl-7.49.1-86\lib\release-dll\libcurl.dll 復(fù)制到 E:\Vbox\curl-7.49.1-86
編譯Virtual Box
  1. 在Vbox根目錄(如:E:\Vbox\VirtualBox-5.0.0)下建立LocalConfig.kmk
VBOX_WITH_HARDENING :=
SDK_VBOX_OPENSSL-x86_INCS := E:/Vbox/openssl-1.0.1t-86/output/include
SDK_VBOX_OPENSSL-x86_LIBS := E:/Vbox/openssl-1.0.1t-86/output/lib/ssleay32.lib E:/Vbox/openssl-1.0.1t-86/output/lib/libeay32.lib
SDK_VBOX_BLD_OPENSSL-x86_LIBS := $(SDK_VBOX_OPENSSL-x86_LIBS)
SDK_VBOX_LIBCURL-x86_INCS := E:/Vbox/curl-7.49.1-86/include
SDK_VBOX_LIBCURL-x86_LIBS.x86 := E:/Vbox/curl-7.49.1-86/lib/release-dll/libcurl.lib
  1. 復(fù)制E:\Vbox\curl-7.49.1-64\include\curl到E:\Vbox\VirtualBox-5.0.0\include\curl
  2. 復(fù)制E:\Vbox\openssl-1.0.1t-64\output\include\openssl到E:\Vbox\VirtualBox-5.0.0\include\openssl
  3. 修改E:\Vbox\VirtualBox-5.0.0\Config.kmk 190行
 #VBOX_NM ?= $(PATH_TOOL_MINGW32)/bin/nm.exe -p
 VBOX_NM ?= E:/Vbox/mingw64/bin/nm.exe -p 
  1. 修改E:\Vbox\VirtualBox-5.0.0\configure.vbs
#line 1063
#if Shell(DosSlashes(strPathVC & "/bin/cl.exe"), True) <> 0 then
if Shell(DosSlashes(strPathVC & "/cl.exe"), True) <> 0 then 
#line 1068
#if   (InStr(1, g_strShellOutput, "Version 16.") <= 0) _
if   (InStr(1, g_strShellOutput, "16.") <= 0) _
#line 1069
#And (InStr(1, g_strShellOutput, "Version 17.") <= 0) then
And (InStr(1, g_strShellOutput, "17.") <= 0) then
#line 1077
#if InStr(1, g_strShellOutput, "Version 16.") > 0 then
if InStr(1, g_strShellOutput, "16.") > 0 then
  1. 修改E:\Vbox\VirtualBox-5.0.0\Makefile.kmk,在最后一行追加
VBOX_BLD_PYTHON=E:\Python\python.exe
  1. 用記事本將以下文件另存為Unicode
E:\Vbox\VirtualBox-5.0.0\src\VBox\Devices\PC\DevLPC.cpp
E:\Vbox\VirtualBox-5.0.0\src\VBox\Disassembler\DisasmCore.cpp
E:\Vbox\VirtualBox-5.0.0\src\VBox\VMM\VMMAll\SELMAll.cpp
E:\Vbox\VirtualBox-5.0.0\src\VBox\Main\testcase\tstGuestCtrlParseBuffer.cpp

其中tstGuestCtrlParseBuffer.cpp修改編碼后會(huì)發(fā)現(xiàn)代碼有問題,將引號(hào)補(bǔ)齊如下

//line 88
    { "??f?\0\0",                    sizeof("??f?\0\0"),                             0,  sizeof("??f?\0") - 1,                   1, VINF_SUCCESS },
    { "??f?\0????",               sizeof("??f?\0????"),                        0,  sizeof("??f?\0") - 1,                   1, VERR_MORE_DATA },
  1. 開始菜單->所有程序->Microsoft Visual Studio 2010->Visual Studio Tools->Visual Studio x64 兼容工具命令提示(2010)
  2. 切換到vbox根目錄,如:E:\Vbox\VirtualBox-5.0.0
  3. 命令行輸入
cscript configure.vbs --with-libSDL=E:\Vbox\SDL-1.2.15 --with-openssl=E:\Vbox\openssl-1.0.1t-64\output --with-libcurl=E:\Vbox\curl-7.49.1-64 --with-QT4=E:\Vbox\qt-everywhere-opensource-src-4.7.3 --with-MinGW-w64=E:\Vbox\mingw64
  1. 修改E:\Vbox\VirtualBox-5.0.0\AutoConfig.kmk
#line 8
#PATH_TOOL_VCC100      := C:/PROGRA~2/MIB5D6~1.0/VC/BIN
PATH_TOOL_VCC100      := C:/PROGRA~2/MIB5D6~1.0/VC
  1. 命令行輸入
env.bat
kbuild\envwin.cmd --win64
kmk

運(yùn)氣好的話,等待1至2小時(shí)就編譯成功了,編譯好的Vbox在E:\Vbox\VirtualBox-5.0.0\out目錄下。

安裝Virtual Box
  1. 將以下dll拷貝到VirtualBox.exe所在目錄下,如: E:\Vbox\VirtualBox-5.0.0\out\win.x86\release\bin
libcurl.dll (e.g.,  from E:\Vbox\curl-7.49.1-64\lib\)
libeay32.dll (e.g., from E:\Vbox\openssl-1.0.1t-64\output\bin\)
ssleay32.dll (e.g., from E:\Vbox\openssl-1.0.1t-64\output\bin\)
QtCore4.dll (e.g., from E:\Vbox\qt-4.7.3\bin)
QtGui4.dll (e.g., from E:\Vbox\qt-4.7.3\bin)
QtNetwork4.dll (e.g., from E:\Vbox\qt-4.7.3\bin)
QtOpenGL4.dll (e.g., from E:\Vbox\qt-4.7.3\bin)
  1. 開始菜單->cmd->右鍵->以管理員身份運(yùn)行
  2. 切換到vbox根目錄,如:E:\Vbox\VirtualBox-5.0.0,命令行輸入
env.bat
  1. 切換到VirtualBox.exe所在目錄下,如: E:\Vbox\VirtualBox-5.0.0\out\win.x86\release\bin,命令行輸入
comregister.cmd
loadall.cmd

安裝完成(偽)

編譯驅(qū)動(dòng)程序簽名的Virtual Box

在經(jīng)歷上面一系列坑爹的步驟之后,相信大家在敲下loadall.cmd的時(shí)候都有一種終于解放了的爽快感。然而天不遂人愿,在loadall.cmd之后,我們馬上就會(huì)看見一堆無情的錯(cuò)誤。


error.png

這是因?yàn)樵趙in7 64位系統(tǒng)上,沒有經(jīng)過簽名認(rèn)證的驅(qū)動(dòng)程序是無法安裝的,所以我們需要在上面的編譯步驟里面加上簽名的步驟,然后整個(gè)重新編譯一次。

創(chuàng)建、安裝測(cè)試證書
  1. 開始菜單->所有程序->Microsoft Visual Studio 2010->Visual Studio Tools->Visual Studio x64 兼容工具命令提示(2010)
  2. 命令行輸入
makecert.exe -r -pe -ss my -n "CN=MyTestCertificate" mytestcert.cer
certmgr.exe -add mytestcert.cer -s -r localMachine root
certmgr.exe 

檢查在“個(gè)人”和“受信任的根證書頒發(fā)機(jī)構(gòu)”里面是否都有MyTestCertificate

  1. 開始菜單->cmd->右鍵->以管理員身份運(yùn)行
  2. 命令行輸入
Bcdedit.exe -set TESTSIGNING ON

這個(gè)據(jù)說是打開win7的調(diào)試模式,使用測(cè)試證書簽名的程序必須在這個(gè)模式下才能使用,可以使用下面的命令關(guān)閉調(diào)試模式。

Bcdedit.exe -set TESTSIGNING OFF

這個(gè)功能可能不能正常使用,我沒有遇到,所以也沒辦法提供解決方法。但是要注意我的筆記本是神舟戰(zhàn)神K660E D1,使用這個(gè)命令后直接無法進(jìn)入Bios,最后是將系統(tǒng)盤安裝在別的電腦上,還原了系統(tǒng)備份才解決。不過據(jù)了解,這個(gè)命令正常來說應(yīng)該是不會(huì)造成這種情況的,我的系統(tǒng)盤在別的電腦上系統(tǒng)也能正常啟動(dòng)。所以神舟戰(zhàn)神K660E D1這款電腦的Bios可能是個(gè)特例。下面繼續(xù):

certmgr.exe -add mytestcert.cer -s -r localMachine root
certmgr.exe -add mytestcert.cer -s -r localMachine trustedpublisher

重啟電腦,然后應(yīng)該能看見桌面右下角顯示“測(cè)試模式”。

重新編譯Vbox需要的dll
  1. 刪除前面除Vbox以外的所有東西,重新解壓新的文件,刪掉Vbox的out目錄,從頭開始。
  2. 修改E:\Vbox\qt-everywhere-opensource-src-4.7.3\mkspecs\win32-msvc2010\qmake.conf
#line 64
#QMAKE_LFLAGS_DLL        = /DLL
QMAKE_LFLAGS_DLL        = /DLL /INTEGRITYCHECK
  1. 重新編譯Qt
  2. 修改E:\Vbox\openssl-1.0.1t-64\ms\ntdll.mak
#line 34
#LFLAGS=/nologo /subsystem:console /opt:ref /debug
LFLAGS=/nologo /subsystem:console /opt:ref /debug /INTEGRITYCHECK
#line 51
#MLFLAGS= /nologo /subsystem:console /opt:ref /debug /dll
MLFLAGS= /nologo /subsystem:console /opt:ref /debug /dll /INTEGRITYCHECK

ntdll.mak 要在ms\do_win64a指令后才會(huì)有,因?yàn)槭切陆鈮旱模砸葓?zhí)行到ms\do_win64a為止。

  1. 重新編譯OpenSSL
  2. 修改E:\Vbox\curl-7.49.1-64\lib\Makefile.vc10
#line 114
#LNKDLL       = link.exe /DLL
LNKDLL       = link.exe /DLL //INTEGRITYCHECK
  1. 重新編譯curl
  2. 開始菜單->所有程序->Microsoft Visual Studio 2010->Visual Studio Tools->Visual Studio x64 兼容工具命令提示(2010)
  3. 使用
Signtool.exe sign –v [name].dll

對(duì)以下文件進(jìn)行簽名

libcurl.dll (e.g., from E:\Vbox\curl-7.49.1-64\lib\)
libeay32.dll (e.g., from E:\Vbox\openssl-1.0.1t-64\output\bin\)
ssleay32.dll (e.g., from E:\Vbox\openssl-1.0.1t-64\output\bin\)
QtCore4.dll (e.g., from E:\Vbox\qt-4.7.3\bin)
QtGui4.dll (e.g., from E:\Vbox\qt-4.7.3\bin)
QtNetwork4.dll (e.g., from E:\Vbox\qt-4.7.3\bin)
QtOpenGL4.dll (e.g., from E:\Vbox\qt-4.7.3\bin)
  1. 可以使用
Link.exe /dump /headers [name].dll

查看DLL characteristics下是否顯示Check integrity

  1. 修改E:\Vbox\VirtualBox-5.0.0\LocalConfig.kmk
#VBOX_WITH_HARDENING :=
VBOX_SIGNING_MODE=test 
  1. 將以下文件復(fù)制到E:\Vbox\VirtualBox-5.0.0\tools\win.x86\selfsign\r1
C:\WinDDK\7600.16385.1\bin\selfsign\*
C:\WinDDK\7600.16385.1\bin\amd64\SignTool.exe
  1. 重新編譯并安裝Vbox
結(jié)語(yǔ)
  1. 至此Vbox編譯安裝結(jié)束,不過受限于驅(qū)動(dòng)簽名證書是測(cè)試證書,只能在開啟了TESTSIGNING模式的電腦上使用。如果想在別的電腦上正常使用,就去證書機(jī)構(gòu)申請(qǐng)證書吧。
  2. 上面的編譯步驟一開始是沒有做驅(qū)動(dòng)簽名的,之所以分開來寫,是想把編譯步驟區(qū)分開來,這樣其中一步出錯(cuò)了,能夠比較快地定位錯(cuò)誤。
  3. 編譯過程中可能會(huì)遇到很多編碼問題,根據(jù)提示一一修改為Unicode即可。
  4. 上述步驟里面并沒有加入webservice API和Java API,如果需要用到相應(yīng)API,參考Windows build instructions
  5. 最后附贈(zèng)一篇編譯Win 32位Vbox的帖子
    Building VirtualBox OSE 5.0.0 on Windows 7 (x86)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,616評(píng)論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,112評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,355評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,727評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,928評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,165評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評(píng)論 1 282
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,585評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,892評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容