环境说明
编译主机系统:windows 7 64位操作系统,Service Pack 1
virtualbox源码版本: 4.3.34
编译过程
virtualbox作为开源x86指令架构虚拟机,有着和vmware一样的企业级别应用和性能,所以使用者众多,官方发布的各个版本的镜像和源码,如果官方镜像不符合我们的需求,按我们就需要根据源码来编译出自己的镜像。当然这么牛逼的复杂的编译过程,官方是有编译说明的,具体链接如下: https://www.virtualbox.org/wiki/Windows%20build%20instructions 既然有官方链接,为啥我还需要脱裤子放屁–多此一举的在这里写这篇文章呢,当然肯定是在编译过程中碰到了很多坑爹的问题,需要记录下,而是给各位看官做下参考。
需要的工具:如下所有工具下载链接请查看如上说的virtualbox的官方编译文档
1. Visual Studio 2010 with service pack 1.
2. Windows Platform SDK v7.1
3. Windows Driver Development Kit (WDK) v7.1.
4. MingW (32-bit Windows only):
5. MingW (64-bit Windows only).
6. Qt v4.7.x or later
7. SDL v1.2.7 or later development package (VC6):
8. libxml2 and libxslt1 libraries.
9. the zlib library.
10. the cURL library.
11. OpenSSL 1.0.1.
12. 签名工具(64-bit Windows only). WDK中自带: certmgr.exe, makecert.exe, signtool.exe and so on.
13. gSOAP 2.7.12, 【可选】编译webservice API server才需要
14. Python 2.x, 【可选】编译webservice and COM才需要
15. Java SE 6 JDK,【可选】编译webservice and COM才需要
在windows 7 64位编译virtualbox,需要使用vs2010的x64 cmd来执行,如下图:
打开此工具后,命令行进入virtualbox 3.4.34的源码目录,事先在源码目录编写一个bat编译脚本,此处命名为make.bat,此脚本具体配置如下:
echo win64下请用“Visual Studio x64 Win64 命令提示(2010) ”运行此脚本
set PATH=%PATH%;C:\VboxBuildTools\VBoxBuild\mingw64\bin;
set PATH=%PATH%;C:\Virtualbox_4.3.34\tools\win.amd64\bin
set PATH=%PATH%;C:\VboxBuildTools\VBoxBuild\mingw64\bin;
set PATH=%PATH%;C:\Virtualbox_4.3.34\tools\darwin.amd64\bin;
set PATH=%PATH%;D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE;
set PATH=%PATH%;D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN;
set PATH=%PATH%;D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools;
set PATH=%PATH%;C:\Windows\Microsoft.NET\Framework\v4.0.30319;
set PATH=%PATH%;C:\Windows\Microsoft.NET\Framework\v3.5;
set PATH=%PATH%;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;
set PATH=%PATH%;D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcpackages;
set PATH=%PATH%;D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64;
set PATH=%PATH%;C:\VboxBuildTools\(Windows Driver Development Kit)GRMWDK_EN_7600_1\WDK;
set PATH=%PATH%;C:\VboxBuildTools\(Windows Driver Development Kit)GRMWDK_EN_7600_1;
echo 运行configure.vbs
cscript configure.vbs --with-MinGW-w64=C:\VboxBuildTools\VBoxBuild\mingw64 --with-libSDL=C:\VboxBuildTools\VBoxBuild\x64\libsdl --with-openssl=C:\VboxBuildTools\VBoxBuild\x64\libopenssl --with-libcurl=C:\VboxBuildTools\VBoxBuild\x64\libcurl --with-Qt4=C:\VboxBuildTools\VBoxBuild\x64\qt-4.8.6 --with-python=C:\Python27 --with-VC-Express-Edition
echo 运行env.bat
call "D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64
call env.bat
call kbuild\envwin.cmd --win64 --release
echo 运行kmk开始编译,此kmk命令请手动执行
::kmk
pause
编写了上述的make.bat之后,直接在vs2010的x64 cmd中执行make命令就可以了,具体过程碰到的问题,请参看如下的“编译FAQ”。 最后,64位系统下,编译完成,在源码下生成一个out目录,编译成功后的输出如下:
编译FAQ:
问题1:
在cmd中编译出现如下错误:
LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
kmk: * [D:/Work/SourceCode/Virtualbox_4.3.34/out/win.x86/release/obj/VBoxAuth/VBoxAuth.dll] Error 1123
The failing command:
@ D:/PROGRA~1/MICROS~1.0/VC/bin/link.exe -nologo -machine:x86 /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug /Version:403.34
/STUB:D:/Work/SourceCode/Virtualbox_4.3.34/src/VBox/HostDrivers/Support/win/winstub.com /DISALLOWLIB:libc.lib /DISALLOWLIB:libcd.lib /DISALLOWLIB:libcmt.lib /DISALLOWLIB:libcmtd.lib /DISALLOWLIB:msvcr
td.lib /DISALLOWLIB:msvcprtd.lib /OUT:D:/Work/SourceCode/Virtualbox_4.3.34/out/win.x86/release/obj/VBoxAuth/VBoxAuth.dll /IMPLIB:D:/Work/SourceCode/Virtualbox_4.3.34/out/win.x86/release/obj/VBoxA
uth/VBoxAuth.lib /MAPINFO:EXPORTS /INCREMENTAL:NO /MAP:D:/Work/SourceCode/Virtualbox_4.3.34/out/win.x86/release/obj/VBoxAuth/VBoxAuth.map /DLL /LIBPATH:C:/PROGRA~2/MICROS~4/Windows/v7.0A/Lib @D:/Wo
rk/SourceCode/Virtualbox_4.3.34/out/win.x86/release/obj/VBoxAuth/VBoxAuth.rsp
kmk: * [D:/Work/SourceCode/Virtualbox_4.3.34/out/win.x86/release/obj/VBoxAuth/VBoxAuth.dll] Deleting file D:/Work/SourceCode/Virtualbox_4.3.34/out/win.x86/release/obj/VBoxAuth/VBoxAuth.lib'
D:/Work/SourceCode/Virtualbox_4.3.34/out/win.x86/release/obj/VBoxAuth/VBoxAuth.exp’
kmk: *** [D:/Work/SourceCode/Virtualbox_4.3.34/out/win.x86/release/obj/VBoxAuth/VBoxAuth.dll] Deleting file
kmk: * [D:/Work/SourceCode/Virtualbox_4.3.34/out/win.x86/release/obj/VBoxAuth/VBoxAuth.dll] Deleting file `D:/Work/SourceCode/Virtualbox_4.3.34/out/win.x86/release/obj/VBoxAuth/VBoxAuth.rsp’
kmk: * Waiting for unfinished jobs….
kmk: * Exiting with status 2
解决方法:
用vs的x64的cmd对话框来运行上述命令
问题2:
Microsoft (R) Windows Script Host Version 5.8
版权所有(C) Microsoft Corporation 1996-2001。保留所有权利。
Shell inheritance test: OK
Source path: OK
Checking for kBuild…
Found kBuild: D:/Work/SourceCode/Virtualbox_4.3.34/kBuild
Found kBuild binaries: D:/Work/SourceCode/Virtualbox_4.3.34/kBuild/bin/win.x86
Checking for Windows DDK v7.1…
Found Windows DDK v7.1: D:/Software/vbox_buildenv_install/WinDDK
Checking for Visual C++…
error: Executing ” (which we believe to be the Visual C++ compiler driver) failed.
解决方法:
计算机 -> 属性 -> “高级系统设置” -> “环境变量”中添加如下变量:
path中增加vs路劲:
%Path%=Path=c:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;D:\Program Files\Microsoft Visual Studio 9.0\VC\BIN;C:\Program Files\Microsoft Visual Studio9.0\Common7\Tools;C:\WINDOWS\Microsoft.NET\Framework\v3.5;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;C:\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages;(Path不需要新建)
系统变量中添加include和lib变量:
%include%=C:\Program Files\Microsoft Visual Studio 10.0\VC\include;(需要新建)
%lib%=C:\Program Files\Microsoft Visual Studio 10.0\VC\lib;
验证上述步骤是否成功:
(之后就可以在命令行中使用cl了(win+R 输入cmd,键入 cl) ,如果在cmd中键入cl执行编译(或lib)时会出现mspdb100.dll无法找到的情况,是因为VC\Bin\下没有mspdb100.dll“这个文件,直接从Common7\IDE\下复制这个文件到VC\Bin\下即可解决。
C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE;D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN;C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools;
C:\Windows\Microsoft.NET\Framework\v4.0.30319;C:\Windows\Microsoft.NET\Framework\v3.5;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcpackages;
问题3:
编译的时候报错如下:
kmk: No rule to make target D:/PROGRA~1/MICROS~1.0/VC/bin/lib/oldnames.lib', needed by
D:/Work/SourceCode/Virtualbox_4.3.34/out/win.x86/release/obj/bin2c/bin2c.exe’. Stop.
解决方法:
1.此为64位编译时的错误,编辑AutoConfig.kmk,修改“PATH_TOOL_VCC100 := D:/PROGRA~1/MICROS~1.0/VC/bin” 为 “PATH_TOOL_VCC100 := D:/PROGRA~1/MICROS~1.0/VC”
2.执行了步骤一之后,再单独执行kmk即可,因为configure.vbs会自动设置AutoConfig.kmk中的变量PATH_TOOL_VCC100
问题4:
fatal error C1902: 程序数据库管理器不匹配;请检查安装:
解决方法:
到C:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE下面拷贝mspdbsrv.exe到C:/Program Files/Microsoft Visual Studio 9.0/VC/bin下面,重启VS即可。
问题5:
LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
解决方法:
连接器LNK是通过调用cvtres.exe完成文件向coff格式的转换的,所以出现这种错误的原因就是cvtres.exe出现了问题。例如:我的电脑里面安装了vs2010,最近更新了系统,打了一些补丁,结果就出现这种错误了。在电脑里面搜索发现
C:\Program Files\Microsoft Visual Studio 10.0\VC\bin
C:\Windows\winsxs\x86_netfx-cvtres_for_vc_and_vb_b03f5f7f11d50a3a_6.1.7600.16385_none_ba476986f05abc65
C:\Windows\Microsoft.NET\Framework\v4.0.30319
这三个路径里面都有cvtres.exe文件,于是我尝试使用第二个路径里面的文件替换第一个路径的文件,问题解决。如果是64为的,把C:\Windows\winsxs\amd64_netfx-cvtres_for_vc_and_vb_b03f5f7f11d50a3a_6.1.7601.22733_none_5ba3b291f5db50a0目录下的文件放到“D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64”路劲下解决
问题6:
启动virtualbox之后有“Cannot access the kernel driver”
解决方法:
需要对virtualbox的几个以sys结尾的文件进行签名,
前面工具使用请参考:http://jingyan.baidu.com/article/acf728fd21c3e7f8e510a3ef.html?qq-pf-to=pcqq.c2c
具体步骤:
1.在“命令行提示符”输入”bcdedit /set testsigning on”回车,然后命令行提示符会显示“操作成功完成”,就可以打开windows测试模式了。
2.用dseo13b.exe测试签名工具对所有的以sys结尾和r0结尾的文件进行签名,然后运行SUPInstall.exe,重新注册驱动即可。
3.对所有以r0结尾的文件镜像系统签名,比如VBoxDDR0.r0,否则启动vbox会报错:Failed to load VMMRO.r0