在win7 64位环境编译 VirtualBox-5.0.0 OSE

最近因需要尝试编译了一次Vbox,官方论坛上只有32位环境的编译教程,所以这次在64位、特别是中文环境上遇到不少坑。这里总结出来,希望对后面的人有帮助。

下载编译所需工具

编译所需工具可参考Windows build instructions
该地址为官网的编译操作指南,写得比较泛泛而谈,简单参考一下即可。我编译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

还有一些东西官网的操作指南有提到,但是不是必须的,在这里我没有用到。

搭建编译环境
  1. 安装Windows Platform SDK
  2. 安装WDK
  3. 安装Visual Studio 2010
  4. 安装Visual Studio 2010 Service pack 1
  5. 安装python和ActivePerl
    最好在安装VS2010之前安装SDK和WDK,不然安装时可能会出显示.Net框架冲突的错误。
开始编译

从现在开始接下来一路是坑

解压文件
  1. 新建一个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复制一份,重命名为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目录加入环境变量,如: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

编译结果将输出到 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

编译结果将输出到 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

编译结果将输出到 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 复制到 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

编译结果将输出到 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 复制到 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. 复制E:\Vbox\curl-7.49.1-64\include\curl到E:\Vbox\VirtualBox-5.0.0\include\curl
  2. 复制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修改编码后会发现代码有问题,将引号补齐如下

//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

运气好的话,等待1至2小时就编译成功了,编译好的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->右键->以管理员身份运行
  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

安装完成(伪)

编译驱动程序签名的Virtual Box

在经历上面一系列坑爹的步骤之后,相信大家在敲下loadall.cmd的时候都有一种终于解放了的爽快感。然而天不遂人愿,在loadall.cmd之后,我们马上就会看见一堆无情的错误。


error.png

这是因为在win7 64位系统上,没有经过签名认证的驱动程序是无法安装的,所以我们需要在上面的编译步骤里面加上签名的步骤,然后整个重新编译一次。

创建、安装测试证书
  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 

检查在“个人”和“受信任的根证书颁发机构”里面是否都有MyTestCertificate

  1. 开始菜单->cmd->右键->以管理员身份运行
  2. 命令行输入
Bcdedit.exe -set TESTSIGNING ON

这个据说是打开win7的调试模式,使用测试证书签名的程序必须在这个模式下才能使用,可以使用下面的命令关闭调试模式。

Bcdedit.exe -set TESTSIGNING OFF

这个功能可能不能正常使用,我没有遇到,所以也没办法提供解决方法。但是要注意我的笔记本是神舟战神K660E D1,使用这个命令后直接无法进入Bios,最后是将系统盘安装在别的电脑上,还原了系统备份才解决。不过据了解,这个命令正常来说应该是不会造成这种情况的,我的系统盘在别的电脑上系统也能正常启动。所以神舟战神K660E D1这款电脑的Bios可能是个特例。下面继续:

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

重启电脑,然后应该能看见桌面右下角显示“测试模式”。

重新编译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指令后才会有,因为是新解压的,所以要先执行到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

对以下文件进行签名

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. 将以下文件复制到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
结语
  1. 至此Vbox编译安装结束,不过受限于驱动签名证书是测试证书,只能在开启了TESTSIGNING模式的电脑上使用。如果想在别的电脑上正常使用,就去证书机构申请证书吧。
  2. 上面的编译步骤一开始是没有做驱动签名的,之所以分开来写,是想把编译步骤区分开来,这样其中一步出错了,能够比较快地定位错误。
  3. 编译过程中可能会遇到很多编码问题,根据提示一一修改为Unicode即可。
  4. 上述步骤里面并没有加入webservice API和Java API,如果需要用到相应API,参考Windows build instructions
  5. 最后附赠一篇编译Win 32位Vbox的帖子
    Building VirtualBox OSE 5.0.0 on Windows 7 (x86)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容