VirtualBox

Windows 构建说明

VirtualBox 是一个跨平台项目,因此我们使用跨平台构建系统,这意味着不会有您可以直接打开并构建的 Visual C++ 项目文件。相反,您必须遵循以下步骤,但它们并不太困难。

先决条件

  • Windows 10 x64Windows 8.1 x64
    旧版 Windows 可能也适用。
  • Visual Studio 2010 Service Pack 1(对于 trunk:Visual Studio 2019 版本 16.11)。
    使用 --with-vc= 为 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 变体都需要。
  • Python 2.7.x,构建 Python API 绑定(包括 webservice 和 COM)所需。也需要构建 3D 支持。从以下位置获取二进制文件:
    https://pythonlang.cn/download/releases/2.7.10/
    使用 --with-python= 为 configure.vbs 指定路径。
  • 代码签名实用程序.
    通常是 WDK 的一部分:certmgr.exemakecert.exesigntool.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 时需要。所需插件:AccessControlNsProcess。从以下位置获取源代码或安装程序:
    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\gsoapVBOX_GSOAP_INSTALLED=1 添加到您的 LocalConfig.kmk 文件中(configure.vbs 不会自动检测)。
    VBOX_WITH_WEBSERVICES= 添加到 LocalConfig.kmk 中,以禁用构建和打包 webservice API 服务器。
  • 可选: AutoIt v3 3.2.10,仅在您希望打包 Guest Additions 时需要。从以下位置获取二进制文件:
    https://www.autoitscript.com/site/autoit/
    LocalConfig.kmk 中使用 VBOX_PATH_AUTOIT3=\path\to\autoit3 来设置此软件包的路径。PATH 应包含 Aut2Exe 目录。
  • 可选: 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 源代码附带的其他库版本

  • 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_INCSSDK_VBOX_ZLIB_LIBS,并相应地在您的 LocalConfig.kmk 中覆盖这些条目。有关使用 LocalConfig.kmk 覆盖默认构建配置的注意事项,请参阅下方

某些先决条件的手动编译

如果您找不到某些先决条件的开发包,也可以手动编译它们。例如,Windows 上似乎没有包含 libcurl.liblibcurl.dll 文件和 'include' 目录的适当 libcurl 包。

要在 Windows 上手动构建 cURL 开发包,您必须:

  1. 确保编译器二进制路径是 PATH 环境变量的一部分,通常是安装目录的 'bin' 目录。该目录必须包含 cl.exelink.exelib.exenmake.exe 等。请务必指定正确的架构路径 (amd64 或 x86)。
  2. 设置 INCLUDE 环境变量以包含编译器的 'atlmfc\include' (ATL/MFC) 和 'include' 目录。
  3. 设置 LIB 环境变量以包含编译器的 'atlmfc\lib' (ATL/MFC) 和 'lib' 目录。请务必指定正确的架构路径 (amd64 或 x86)。
  4. 设置 LIBPATH 环境变量以包含编译器的 'atlmfc\lib' (ATL/MFC) 目录。请务必指定正确的架构路径 (amd64 或 x86)。
  5. 设置 PATH 环境变量以包含 (7.1) SDK 的 'bin' 目录。请务必指向正确的架构路径 (amd64 或 x86)。
  6. 设置 INCLUDE 环境变量以包含 (7.1) SDK 的 'include' 目录。
  7. 设置 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

  1. 更改到根目录并执行我们的配置脚本以设置您的构建环境
    cscript configure.vbs
    
    如果脚本找到了所有必要的工具,它将输出两个文件:AutoConfig.kmk(包含在您的系统上查找工具的信息)和 env.bat(一个用于设置 VirtualBox 构建环境的批处理文件)。您只需执行此步骤一次,除非您的工具发生更改,在这种情况下您必须重复上述步骤。请记住,脚本总是会覆盖这两个生成的文件,因此您不应手动编辑它们。

默认目标将与主机目标相同,即,在 32 位主机上,环境将设置为编译 32 位 VirtualBox 目标 (x86),而在 64 位主机上,环境将设置为编译 64 位 VirtualBox 目标 (amd64)。默认设置可以通过使用 --target-arch= 参数来覆盖。

  1. 更改到源代码的根目录并进入我们的构建 shell 环境:env.bat
  1. 要手动覆盖任何工具或更改 Config.kmk 设置,请在源代码的根目录中创建 LocalConfig.kmk 并将设置放在那里。有关可能设置的不完整列表,请参阅下方
  1. 要构建发布包,请键入 kmk。这将在 out\win.x86\release\bin(或 64 位主机上的 out\win.amd64\release\bin)中生成二进制文件。如果您想构建调试版本,请输入 kmk KBUILD_TYPE=debug
  1. 要创建 .msi 包,请键入 `kmk packing'。
    如果 Guest Additions 是构建过程的一部分(这是默认设置,通过在 LocalConfig.kmk 中添加 VBOX_WITH_ADDITIONS=VBOX_WITH_ADDITIONS_PACKING= 来禁用,请参阅下方),则此步骤将针对 64 位 (amd64) 目标失败。它将抱怨对 out\win.x86\release\bin\additionsVBoxOGL* 库的依赖。在这种情况下,请通过执行以下操作来创建 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 正常工作。要使用测试签名的二进制文件,目标机器必须在测试签名模式下运行,并且必须在目标机器上安装测试证书。

第一部分:创建并安装测试证书

  1. 启动一个提升权限的命令行 shell(Vista 及更高版本)。
  2. makecert.exe -r -pe -ss my -eku 1.3.6.1.5.5.7.3.3 -n "CN=MyTestCertificate" mytestcert.cer
  3. certmgr.exe -add mytestcert.cer -s -r localMachine root
  4. 启动 certmgr.exe 并检查“MyTestCertificate”是否同时列在“个人”和“受信任的根证书颁发机构”下。
    如果您安装了自签名证书并升级到 Windows 10,可能会出现证书仍列在“受信任的根证书颁发机构”下,但不再列在“个人”下的情况。在这种情况下,请使用 certmgr.msc 移除旧证书,并创建新证书(如上所述)并安装。
  5. 将 mytestcert.cer 文件保存在安全位置。

第二部分:配置系统以运行测试签名代码(Vista 及更高版本)

  1. 启动一个提升权限的命令行 shell(Vista 及更高版本)。
  2. 在提升权限的 cmd.exe 提示符下运行 Bcdedit.exe -set TESTSIGNING ON
  3. certmgr.exe -add mytestcert.cer -s -r localMachine root
  4. certmgr.exe -add mytestcert.cer -s -r localMachine trustedpublisher
  5. 重启。
  6. Vista 及更高版本:“测试模式”将出现在桌面所有四个角落,并且“Microsoft (R) Windows (R) (Build 6000)”将出现在顶部。Windows 7 及更高版本:“测试模式<CR>Windows 7<CR>内部版本 7600”或类似字样将出现在右下角。

第三部分:启用签名构建 VirtualBox

  1. 如果您将证书命名为 MyTestCertificate 以外的名称,则需要在 LocalConfig.kmk 中进行适当的覆盖。有关可以覆盖的内容,请参阅 Config.kmkCode Signing 部分。
  2. VBOX_SIGNING_MODE=test 添加到 LocalConfig.kmk
  3. 构建(增量构建即可)。

运行 VirtualBox

VirtualBox 需要设备驱动程序和 COM 类才能运行。每当这些发生更改时,您都必须重新注册它们。为了重新注册 COM 类,请执行

comregister.cmd

该文件可在输出目录 (out\win.ARCH\release\bin) 中找到。请注意,要使其正常工作,VBoxSVC.exe 不得运行,因此请使用 Windows 任务管理器进行验证。通常 VBoxSVC.exe 在 5 秒不活动(即没有客户端连接)后会自动终止,但特别是在开发时,它有时可能会一直存在。如果 COM 类发生更改(这通常发生在 VirtualBox.xidl 文件更新时)并且您忘记重新注册这些类,则可能会出现奇怪的问题。

在您可以从输出目录启动任何二进制文件之前,您必须确保外部库(例如 libcurl.dlllibcrypto.dll)位于可通过 PATH 变量访问的目录中,或将这些库复制到输出目录。

为了(重新)安装 VirtualBox 内核驱动程序(驱动程序必须已签名),请执行以下操作:

loadall.cmd

通过调用其前端之一(例如)来启动 VirtualBox:

VirtualBox.exe

VBoxHeadless.exe

常见问题

我使用 --with-xyz=PATH 指定了一个先决条件,但 configure.vbs 无法找到它。
查看 configure.log 文件。目录布局可能不符合预期。例如,OpenSSL 包应包含两个目录:包含 libssl.liblibcrypto.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 位版本。
上次修改 3 年前 最后修改于 2022 年 1 月 27 日 下午 07:08:36
注意: 查看 TracWiki 获取使用维基的帮助。

© 2025 Oracle 支持 隐私 / 请勿出售我的信息 使用条款 商标政策 自动化访问礼节