MacOS 下编译 VirtualBox

在编译 VBox 的时候遇到了许多坑,记录一下。

环境是 MacOS 10.15 Catalina,VBox 6.1.16 。

安装SDK

Xcode10之后编译系统改了,我们需要用老版本的Xcode编译,所以要用 XcodeLegacy

1
2
git clone --depth=1 https://hub.fastgit.org/devernay/xcodelegacy.git
cd xcodelegacy

再下载 Xcode6.4 ,放到 xcodelegacy 目录下。

安装一下

1
2
./XcodeLegacy.sh -osx109 buildpackages
sudo ./XcodeLegacy.sh -osx109 install

安装依赖

  • 安装 homebrew,brew install libidl openssl pkg-config qt
  • JDK版本>=6 ,我用的 JDK8
  • openssl

编译 openssl

link 的时候可能会因为目标版本不一致出现问题,需要用 10.9 编译的 openssl

下载 openssl ,解压后编译

1
2
3
./config CFLAGS="-g -O2 -mmacosx-version-min=10.9 -isysroot /Developer/SDKs/MacOSX10.9.sdk" CXXFLAGS="-g -O2 -mmacosx-version-min=10.9 -isysroot /Developer/SDKs/MacOSX10.9.sdk" LDFLAGS="-mmacosx-version-min=10.9 -isysroot /Developer/SDKs/MacOSX10.9.sdk" --prefix=/usr/local/opt/openssl@1.1.1i
make -j8
make install

编译

下面开始编译,中途可能还会有些编译错误,需要自己解决一下。末尾有我遇到的问题及解决。

先修改 configure 的 check_darwinversion()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
check_darwinversion()
{
test_header "Darwin version"
darwin_ver=`uname -r`
case "$darwin_ver" in
+ 19\.*)
+ check_xcode_sdk_path "$WITH_XCODE_DIR"
+ [ $? -eq 1 ] || fail
+ darwin_ver="10.15" # Catalina
+ sdk=$WITH_XCODE_DIR/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk
+ cnf_append "VBOX_WITH_MACOSX_COMPILERS_FROM_DEVEL" "1"
+ cnf_append "VBOX_PATH_MACOSX_DEVEL_ROOT" "$WITH_XCODE_DIR/Developer"
+ CXX_FLAGS='--std=c++11'
+ ;;
17\.*)
check_xcode_sdk_path "$WITH_XCODE_DIR"
[ $? -eq 1 ] || fail
darwin_ver="10.13" # High Sierra
sdk=$WITH_XCODE_DIR/Developer/SDKs/MacOSX10.6.sdk
cnf_append "VBOX_WITH_MACOSX_COMPILERS_FROM_DEVEL" "1"
cnf_append "VBOX_PATH_MACOSX_DEVEL_ROOT" "$WITH_XCODE_DIR/Developer"
;;

配置

1
2
./configure --disable-hardening --with-xcode-dir=/Developer/SDKs/MacOSX10.9.sdk \
--with-openssl-dir=/usr/local/opt/openssl@1.1.1i --with-qt-dir=/usr/local/Cellar/qt/5.15.2

修改 tools/kBuildTools/VBoxXcode62.kmk ,开启 c++11 支持

1
2
3
4
5
-TOOL_VBoxXcode62_CXXFLAGS         ?=
+TOOL_VBoxXcode62_CXXFLAGS ?= --std=c++11

-TOOL_VBoxXcode62_OBJCXXFLAGS ?=
+TOOL_VBoxXcode62_OBJCXXFLAGS ?= --std=c++11

一处程序错误 src/VBox/Devices/USB/darwin/USBProxyDevice-darwin.cpp

1
2
-    AssertReturn(RefMatchingDict != IO_OBJECT_NULL, VERR_OPEN_FAILED);
+ AssertReturn(RefMatchingDict, VERR_OPEN_FAILED);

开始编译

1
2
source env.sh
kmk

FAQ

  • 报错 yasm: Bad CPU type in executable

    因为不支持 32 位应用,需要用 x64 的 yasm 替换,

    brew install yasm && cp /usr/local/Cellar/yasm/1.3.0_2/bin/yasm tools/darwin.amd64/bin/

  • 报错 kBuild: iasl VBoxDD ....

    问题同上,找 x64 的 iasl 替换,https://bitbucket.org/RehabMan/acpica/downloads/iasl.zip ,

    cp iasl tools/darwin.amd64/bin/iasl

  • 找不到 libqcocoa.dylib

    修改 AutoConfig.kmk

    1
    2
    3
    4
    5
    6
    7
    - PATH_SDK_QT5_INC               := /usr/local/Cellar/qt/5.15.2/Frameworks
    - PATH_SDK_QT5_LIB := /usr/local/Cellar/qt/5.15.2/Frameworks
    - PATH_SDK_QT5 := /usr/local/Cellar/qt/5.15.2/Frameworks

    + PATH_SDK_QT5_INC := /usr/local/Cellar/qt/5.15.2/include
    + PATH_SDK_QT5_LIB := /usr/local/Cellar/qt/5.15.2/lib
    + PATH_SDK_QT5 := /usr/local/Cellar/qt/5.15.2/

    或者创建软链接

    1
    2
    mkdir /usr/local/Cellar/qt/5.15.2/Frameworks/plugins
    ln -s /usr/local/Cellar/qt/5.15.2/plugins/platforms /usr/local/Cellar/qt/5.15.2/Frameworks/plugins/platforms
文章目录
  1. 1. 安装SDK
  2. 2. 安装依赖
    1. 2.1. 编译 openssl
  3. 3. 编译
  4. 4. FAQ
|