Windows 构建说明
VirtualBox 是一个跨平台项目,因此我们使用跨平台构建系统,这意味着不会有您可以直接打开并构建的 Visual C++ 项目文件。相反,您必须遵循以下步骤,但它们并不太困难。
先决条件
- Windows 10 x64 或 Windows 8.1 x64。
旧版 Windows 可能也适用。
- Visual Studio 2010 Service Pack 1(对于 trunk:Visual Studio 2019 版本 16.11)。
使用--with-vc=
为 configure.vbs 指定路径。
- Windows Platform SDK v7.1(仅用于构建 VirtualBox 6.1.x)。
http://www.microsoft.com/en-us/download/details.aspx?id=8279
使用--with-sdk=
为 configure.vbs 指定路径。
- Windows SDK 11 和 WDK 11(仅用于构建 trunk)。
https://go.microsoft.com/fwlink/?linkid=2166460 和 https://go.microsoft.com/fwlink/?linkid=2166289,另请参阅 https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk
使用--with-sdk10=
为 configure.vbs 指定路径。
- Windows Driver Development Kit (WDK) v7.1(主要用于构建 Guest Additions)。
http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11800
使用--with-ddk=
为 configure.vbs 指定路径。
- Qt v5.6.x 或更高版本
注意!这必须使用上面提到的 Visual C++ 编译器进行构建。
使用--with-qt5=
为 configure.vbs 指定路径。
- SDL v1.2.7 或更高版本开发包 (VC6)
http://www.libsdl.org/download-1.2.php
使用--with-libsdl=
为 configure.vbs 指定路径。
将--disable-sdl
作为 configure.vbs 的参数,以禁用 SDL 前端并移除对 SDL 的依赖。
- cURL 库。从以下位置获取二进制文件:
http://curl.haxx.se/download.html
(使用不带 SSL 支持的开发版本)
使用--with-libcurl=
为 configure.vbs 指定路径。对于构建 64 位目标,您需要添加--with-libcurl32=
以指定 32 位 cURL 开发包的路径,因为此时 32 位和 64 位 cURL 变体都需要。
- Yasm 1.3,构建汇编代码文件所需。从以下位置获取二进制文件:
https://yasm.tortall.net/Download.html
如果 PATH 中能找到 yasm.exe,则表示您已准备就绪。
- Python 2.7.x,构建 Python API 绑定(包括 webservice 和 COM)所需。也需要构建 3D 支持。从以下位置获取二进制文件:
https://pythonlang.cn/download/releases/2.7.10/
使用--with-python=
为 configure.vbs 指定路径。
- 代码签名实用程序.
通常是 WDK 的一部分:certmgr.exe
、makecert.exe
、signtool.exe
等。
在LocalConfig.kmk
中使用VBOX_PATH_SIGN_TOOLS=\path\to\signtool.exe
来设置signtool.exe
工具的路径。
在LocalConfig.kmk
中使用VBOX_INF2CAT=\path\to\inf2cat.exe
来设置inf2cat.exe
工具的路径。
- 可选: NSIS 3.x,仅在您希望构建包含安装程序的 Guest Additions 时需要。所需插件:
AccessControl
、NsProcess
。从以下位置获取源代码或安装程序:
https://nsis.sourceforge.io/Download
在LocalConfig.kmk
中使用VBOX_PATH_NSIS=
来设置此软件包的路径。
- 可选: gSOAP 2.8.x,仅在您希望构建 webservice API 服务器时需要。从以下位置获取源代码:
http://sourceforge.net/projects/gsoap2/files/gSOAP/gSOAP%202.8.72%20stable/
将VBOX_PATH_GSOAP=\path\to\gsoap-VERSION\gsoap
和VBOX_GSOAP_INSTALLED=1
添加到您的LocalConfig.kmk
文件中(configure.vbs 不会自动检测)。
将VBOX_WITH_WEBSERVICES=
添加到LocalConfig.kmk
中,以禁用构建和打包 webservice API 服务器。
- 可选: Java SE 6 JDK,仅在您希望构建 Java API 绑定(包括 webservice 和 COM)时需要。从以下位置获取二进制文件:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
- 可选: AutoIt v3 3.2.10,仅在您希望打包 Guest Additions 时需要。从以下位置获取二进制文件:
https://www.autoitscript.com/site/autoit/
在LocalConfig.kmk
中使用VBOX_PATH_AUTOIT3=\path\to\autoit3
来设置此软件包的路径。PATH
应包含 Aut2Exe 目录。
- 可选: Driver Install Frameworks (DIFx) 2.1,仅在您希望打包 Guest Additions 时需要。请参阅:
https://support.microsoft.com/en-us/help/910189/information-about-updates-for-driver-install-frameworks-difx-tools
在LocalConfig.kmk
中使用VBOX_PATH_DIFX=\path\to\DIFx
来设置此软件包的路径。
- 可选:
mkisofs.exe
,仅在您希望打包 Guest Additions 时需要。从以下位置获取软件包:
http://opensourcepack.blogspot.de/p/cdrtools.html
在LocalConfig.kmk
中使用VBOX_MKISOFS=\path\to\mkisofs.exe
来设置mkisofs.exe
二进制文件的路径。
- 可选:
zip.exe
,仅在您希望打包 Validation Kit 时需要(通过在LocalConfig.kmk
中添加VBOX_WITH_VALIDATIONKIT=
来禁用)。从以下位置获取软件包:
http://gnuwin32.sourceforge.net/packages/zip.htm
在LocalConfig.kmk
中使用VBOX_ZIP=\path\to\zip.exe
来设置zip.exe
二进制文件的路径。
- 可选: WIX toolset 3.8.1128,仅在您希望打包 VirtualBox 时需要。从以下位置获取二进制文件:
http://wixtoolset.org/releases/
在LocalConfig.kmk
中使用VBOX_WIX_PATH=\path\to\WIX
来设置此软件包的路径。
- 可选: WiSumInf.vbs SDK 脚本,仅在您希望打包 VirtualBox 时需要。所需脚本为:
sdk-v7.1\Samples\sysmgmt\msi\scripts\WiSumInf.vbs
(参见上面 SDK 7.1 的先决条件)
在LocalConfig.kmk
中使用VBOX_PATH_WISUMINFO=\path\to\WiSumInf.vbs
来设置此脚本的路径。
使用 VBox 源代码附带的其他库版本
- libxml2 库。源代码和 32 位二进制文件可从以下位置下载:
http://xmlsoft.org/downloads.html
使用--with-libxml2=
为 configure.vbs 指定路径。
- OpenSSL 1.1.1 或更高版本。从以下位置获取二进制文件:
https://slproweb.com/products/Win32OpenSSL.html
使用--with-openssl=
为 configure.vbs 指定路径。对于构建 64 位目标,您需要添加--with-openssl32=
以指定 32 位 OpenSSL 开发包的路径,因为此时 32 位和 64 位 OpenSSL 变体都需要。
- zlib 库。从以下位置获取源代码:
http://www.zlib.net/
实际上,tarball 在 'src\libs
' 目录中包含zlib
,因此只有在需要更新版本时才需要下载此库。在这种情况下,请在Config.kmk
中查找SDK_VBOX_ZLIB_INCS
和SDK_VBOX_ZLIB_LIBS
,并相应地在您的LocalConfig.kmk
中覆盖这些条目。有关使用LocalConfig.kmk
覆盖默认构建配置的注意事项,请参阅下方。
某些先决条件的手动编译
如果您找不到某些先决条件的开发包,也可以手动编译它们。例如,Windows 上似乎没有包含 libcurl.lib
、libcurl.dll
文件和 'include
' 目录的适当 libcurl
包。
要在 Windows 上手动构建 cURL 开发包,您必须:
- 确保编译器二进制路径是
PATH
环境变量的一部分,通常是安装目录的 'bin
' 目录。该目录必须包含cl.exe
、link.exe
、lib.exe
、nmake.exe
等。请务必指定正确的架构路径 (amd64 或 x86)。 - 设置
INCLUDE
环境变量以包含编译器的 'atlmfc\include
' (ATL/MFC) 和 'include
' 目录。 - 设置
LIB
环境变量以包含编译器的 'atlmfc\lib
' (ATL/MFC) 和 'lib
' 目录。请务必指定正确的架构路径 (amd64 或 x86)。 - 设置
LIBPATH
环境变量以包含编译器的 'atlmfc\lib
' (ATL/MFC) 目录。请务必指定正确的架构路径 (amd64 或 x86)。 - 设置
PATH
环境变量以包含 (7.1) SDK 的 'bin
' 目录。请务必指向正确的架构路径 (amd64 或 x86)。 - 设置
INCLUDE
环境变量以包含 (7.1) SDK 的 'include
' 目录。 - 设置
LIB
环境变量以包含 (7.1) SDK 的 'lib
' 目录。请务必指定正确的架构路径 (amd64 或 x86)。
设置好所有这些环境变量后,进入 'curl-VERSION\winbuild
' 目录并执行
nmake /f Makefile.vc mode=dll VC=10 MACHINE=x64 or nmake /f Makefile.vc mode=dll VC=10 MACHINE=x86
生成的软件包位于 'builds\libcurl-vc10-*-winssl
' 目录中。configure.vbs 脚本要求 libcurl.lib 和 libcurl.dll 位于 'include
' 目录旁边。建议将 'libcurl-vc10-*-winssl
' 目录复制到其他位置。然后使用 --with-libcurl=
参数为 configure.vbs 指定路径。
构建 VirtualBox
- 更改到根目录并执行我们的配置脚本以设置您的构建环境
cscript configure.vbs
如果脚本找到了所有必要的工具,它将输出两个文件:AutoConfig.kmk
(包含在您的系统上查找工具的信息)和env.bat
(一个用于设置 VirtualBox 构建环境的批处理文件)。您只需执行此步骤一次,除非您的工具发生更改,在这种情况下您必须重复上述步骤。请记住,脚本总是会覆盖这两个生成的文件,因此您不应手动编辑它们。
默认目标将与主机目标相同,即,在 32 位主机上,环境将设置为编译 32 位 VirtualBox 目标 (
x86
),而在 64 位主机上,环境将设置为编译 64 位 VirtualBox 目标 (amd64
)。默认设置可以通过使用--target-arch=
参数来覆盖。
- 更改到源代码的根目录并进入我们的构建 shell 环境:
env.bat
。
- 要手动覆盖任何工具或更改
Config.kmk
设置,请在源代码的根目录中创建LocalConfig.kmk
并将设置放在那里。有关可能设置的不完整列表,请参阅下方。
- 要构建发布包,请键入
kmk
。这将在out\win.x86\release\bin
(或 64 位主机上的out\win.amd64\release\bin
)中生成二进制文件。如果您想构建调试版本,请输入kmk KBUILD_TYPE=debug
。
- 要创建
.msi
包,请键入 `kmk packing'。
如果 Guest Additions 是构建过程的一部分(这是默认设置,通过在LocalConfig.kmk
中添加VBOX_WITH_ADDITIONS=
和VBOX_WITH_ADDITIONS_PACKING=
来禁用,请参阅下方),则此步骤将针对 64 位 (amd64
) 目标失败。它将抱怨对out\win.x86\release\bin\additions
中VBoxOGL*
库的依赖。在这种情况下,请通过执行以下操作来创建 32 位 Guest Additions:kmk VBOX_ONLY_ADDITIONS=1 KBUILD_TARGET_ARCH=x86
之后,再次键入kmk packing
,它应该会成功。
使用 Visual C++ 2010 Express
如果您没有 Visual C++ 许可证,可以使用 Visual C++ 2010 Express。但是,您将无法构建任何前端,因为 VirtualBox COM API(所有其他前端都针对此 API 编程)需要 Active Template Library (ATL) 才能构建,不幸的是,Express 版本不包含此功能(请参阅 http://msdn.microsoft.com/vstudio/express/support/faq/#vcpp)。
在执行第一个构建步骤时,您必须将 --with-VC-Express-Edition 添加到参数列表
cscript configure.vbs --with-VC-Express-Edition
从构建中排除某些功能
以下是可添加到 LocalConfig.kmk
中以阻止某些功能构建/打包的不完整设置列表
- VBOX_WITH_ADDITIONS=
- VBOX_WITH_ADDITIONS_PACKING=
- 不要构建和打包 VirtualBox Guest Additions。如果仅指定
VBOX_WITH_ADDITIONS=
,则 Guest Additions 不会被构建,但会预期VBoxGuestAdditions.iso
文件存在于 'out\win.ARCH\release\bin\additions
' 目录中。 - VBOX_ONLY_ADDITIONS=1
- 仅构建 Guest Additions。
- VBOX_WITH_VALIDATIONKIT=
- 不要构建和打包 VirtualBox 验证工具包。验证工具包无论如何都不是最终
.msi
包的一部分。 - VBOX_WITH_WEBSERVICES=
- 不要构建和打包 webservices API 服务器。
- VBOX_WITHOUT_HARDENING=1
- 禁用 Windows 强化。对于测试很有用。不要将此设置用于生产构建!未强化的二进制文件将未签名,并且 VirtualBox.exe 可以直接从 out\...\bin 目录启动(无需
kmk packing
+ 安装)。
请注意,仍然需要启用代码签名才能启动虚拟机,因为 Windows 拒绝加载未签名的内核驱动程序。
设置自签名(64 位 Windows,32 位 Windows 10)
设置测试签名将允许构建已签名的二进制文件以使 Windows 正常工作。要使用测试签名的二进制文件,目标机器必须在测试签名模式下运行,并且必须在目标机器上安装测试证书。
第一部分:创建并安装测试证书
- 启动一个提升权限的命令行 shell(Vista 及更高版本)。
makecert.exe -r -pe -ss my -eku 1.3.6.1.5.5.7.3.3 -n "CN=MyTestCertificate" mytestcert.cer
certmgr.exe -add mytestcert.cer -s -r localMachine root
- 启动 certmgr.exe 并检查“MyTestCertificate”是否同时列在“个人”和“受信任的根证书颁发机构”下。
如果您安装了自签名证书并升级到 Windows 10,可能会出现证书仍列在“受信任的根证书颁发机构”下,但不再列在“个人”下的情况。在这种情况下,请使用 certmgr.msc 移除旧证书,并创建新证书(如上所述)并安装。 - 将 mytestcert.cer 文件保存在安全位置。
第二部分:配置系统以运行测试签名代码(Vista 及更高版本)
- 启动一个提升权限的命令行 shell(Vista 及更高版本)。
- 在提升权限的 cmd.exe 提示符下运行
Bcdedit.exe -set TESTSIGNING ON
。 certmgr.exe -add mytestcert.cer -s -r localMachine root
certmgr.exe -add mytestcert.cer -s -r localMachine trustedpublisher
- 重启。
- Vista 及更高版本:“测试模式”将出现在桌面所有四个角落,并且“Microsoft (R) Windows (R) (Build 6000)”将出现在顶部。Windows 7 及更高版本:“测试模式<CR>Windows 7<CR>内部版本 7600”或类似字样将出现在右下角。
第三部分:启用签名构建 VirtualBox
- 如果您将证书命名为 MyTestCertificate 以外的名称,则需要在
LocalConfig.kmk
中进行适当的覆盖。有关可以覆盖的内容,请参阅Config.kmk
的Code Signing
部分。 - 将
VBOX_SIGNING_MODE=test
添加到LocalConfig.kmk
。 - 构建(增量构建即可)。
运行 VirtualBox
VirtualBox 需要设备驱动程序和 COM 类才能运行。每当这些发生更改时,您都必须重新注册它们。为了重新注册 COM 类,请执行
comregister.cmd
该文件可在输出目录 (out\win.ARCH\release\bin
) 中找到。请注意,要使其正常工作,VBoxSVC.exe
不得运行,因此请使用 Windows 任务管理器进行验证。通常 VBoxSVC.exe
在 5 秒不活动(即没有客户端连接)后会自动终止,但特别是在开发时,它有时可能会一直存在。如果 COM 类发生更改(这通常发生在 VirtualBox.xidl
文件更新时)并且您忘记重新注册这些类,则可能会出现奇怪的问题。
在您可以从输出目录启动任何二进制文件之前,您必须确保外部库(例如 libcurl.dll
或 libcrypto.dll
)位于可通过 PATH
变量访问的目录中,或将这些库复制到输出目录。
为了(重新)安装 VirtualBox 内核驱动程序(驱动程序必须已签名),请执行以下操作:
loadall.cmd
通过调用其前端之一(例如)来启动 VirtualBox:
VirtualBox.exe
或
VBoxHeadless.exe
常见问题
- 我使用
--with-xyz=PATH
指定了一个先决条件,但configure.vbs
无法找到它。 - 查看
configure.log
文件。目录布局可能不符合预期。例如,OpenSSL
包应包含两个目录:包含libssl.lib
和libcrypto.lib
的 'lib
' 目录,以及 'include
' 目录。
- 构建立即停止,并显示 ***您需要启用代码签名才能使强化的 Windows 构建正常工作。
- 消息很清楚:代码签名必须正常工作,因为 Windows 仅适用于正确签名的驱动程序。如果代码签名未正确设置,则临时的测试解决方法是将
VBOX_WITHOUT_HARDENING=1
添加到您的LocalConfig.kmk
。切勿在生产环境中使用此设置!启动虚拟机仍然需要启用代码签名,请参阅上方。
- 键入
kmk
会弹出一个消息框:应用程序无法正常启动 (0xc0000022)。点击“确定”关闭应用程序。 - 错误代码
0xc0000022
表示STATUS_ACCESS_DENIED
(访问被拒绝)。最可能的原因是kmk.exe
二进制文件或某个 DLL(例如 kBuild\bin\win.x86\msvcr100.dll 或 kBuild\bin\win.amd64\msvcr100.dll)未设置执行位。如果使用 Cygwin 二进制文件解压 .tar.bz2 归档,则会发生这种情况。解决方案:设置源代码树中所有.exe
和.dll
文件的执行位。当然,这同样适用于先决条件目录中的所有.exe
和.dll
文件!
- 如何创建与官方下载页面上可用的 VirtualBox.exe 软件包类似的软件包?
- 这通过添加
VBOX_WITH_COMBINED_PACKAGE=1
来控制。此类软件包结合了两个.msi
软件包:32 位版本和 64 位版本。