建置 Arrow C++#

系統設定#

Arrow 使用 CMake 作為建置組態系統。我們建議進行 out-of-source 建置。如果您不熟悉此術語

  • In-source 建置(源碼內建置)cmake 直接從 cpp 目錄中調用。當您希望維護多個建置環境時(例如,一個用於除錯建置,另一個用於發布建置),這種方式可能不夠彈性

  • Out-of-source 建置(源碼外建置)cmake 從另一個目錄調用,建立一個隔離的建置環境,該環境不會與任何其他建置環境互動。例如,您可以建立 cpp/build-debug 目錄,並從此目錄中調用 cmake $CMAKE_ARGS ..

建置需求

  • 支援 C++17 的編譯器。在 Linux 上,gcc 7.1 或更高版本應已足夠。對於 Windows,至少需要 Visual Studio VS2017。

  • CMake 3.16 或更高版本

  • 在 Linux 和 macOS 上,需要 makeninja 建置工具

  • 最少 1GB 的 RAM 用於最小化建置,4GB 用於包含測試的最小化除錯建置,以及 8GB 用於使用 docker 的完整建置。

在 Ubuntu/Debian 上,您可以使用以下命令安裝所需套件:

sudo apt-get install \
     build-essential \
     ninja-build \
     cmake

在 Alpine Linux 上

apk add autoconf \
        bash \
        cmake \
        g++ \
        gcc \
        ninja \
        make

在 Fedora Linux 上

sudo dnf install \
     cmake \
     gcc \
     gcc-c++ \
     ninja-build \
     make

在 Arch Linux 上

sudo pacman -S --needed \
     base-devel \
     ninja \
     cmake

在 macOS 上,您可以使用 Homebrew

git clone https://github.com/apache/arrow.git
cd arrow
brew update && brew bundle --file=cpp/Brewfile

使用 vcpkg

git clone https://github.com/apache/arrow.git
cd arrow
vcpkg install \
  --x-manifest-root cpp \
  --feature-flags=versions \
  --clean-after-build

在 MSYS2 上

pacman --sync --refresh --noconfirm \
  ccache \
  git \
  mingw-w64-${MSYSTEM_CARCH}-boost \
  mingw-w64-${MSYSTEM_CARCH}-brotli \
  mingw-w64-${MSYSTEM_CARCH}-cmake \
  mingw-w64-${MSYSTEM_CARCH}-gcc \
  mingw-w64-${MSYSTEM_CARCH}-gflags \
  mingw-w64-${MSYSTEM_CARCH}-glog \
  mingw-w64-${MSYSTEM_CARCH}-gtest \
  mingw-w64-${MSYSTEM_CARCH}-lz4 \
  mingw-w64-${MSYSTEM_CARCH}-protobuf \
  mingw-w64-${MSYSTEM_CARCH}-python3-numpy \
  mingw-w64-${MSYSTEM_CARCH}-rapidjson \
  mingw-w64-${MSYSTEM_CARCH}-snappy \
  mingw-w64-${MSYSTEM_CARCH}-thrift \
  mingw-w64-${MSYSTEM_CARCH}-zlib \
  mingw-w64-${MSYSTEM_CARCH}-zstd

建置#

以下所有指示都假設您已克隆 Arrow git 儲存庫並導航至 cpp 子目錄

$ git clone https://github.com/apache/arrow.git
$ cd arrow/cpp

CMake 預設配置#

使用 CMake 3.21.0 或更高版本,提供了一些適用於各種建置組態的預設配置。您可以使用 cmake --list-presets 取得可用預設配置的列表

$ cmake --list-presets   # from inside the `cpp` subdirectory
Available configure presets:

  "ninja-debug-minimal"     - Debug build without anything enabled
  "ninja-debug-basic"       - Debug build with tests and reduced dependencies
  "ninja-debug"             - Debug build with tests and more optional components
   [ etc. ]

您可以使用 cmake -N --preset <預設配置名稱> 檢查給定預設配置啟用的特定選項

$ cmake --preset -N ninja-debug-minimal
Preset CMake variables:

  ARROW_BUILD_INTEGRATION="OFF"
  ARROW_BUILD_STATIC="OFF"
  ARROW_BUILD_TESTS="OFF"
  ARROW_EXTRA_ERROR_CONTEXT="ON"
  ARROW_WITH_RE2="OFF"
  ARROW_WITH_UTF8PROC="OFF"
  CMAKE_BUILD_TYPE="Debug"

您也可以從給定的預設配置建立建置

$ mkdir build   # from inside the `cpp` subdirectory
$ cd build
$ cmake .. --preset ninja-debug-minimal
   Preset CMake variables:

     ARROW_BUILD_INTEGRATION="OFF"
     ARROW_BUILD_STATIC="OFF"
     ARROW_BUILD_TESTS="OFF"
     ARROW_EXTRA_ERROR_CONTEXT="ON"
     ARROW_WITH_RE2="OFF"
     ARROW_WITH_UTF8PROC="OFF"
     CMAKE_BUILD_TYPE="Debug"

   -- Building using CMake version: 3.21.3
   [ etc. ]

然後要求編譯建置目標

$ cmake --build .
[142/142] Creating library symlink debug/libarrow.so.700 debug/libarrow.so

$ tree debug/
debug/
├── libarrow.so -> libarrow.so.700
├── libarrow.so.700 -> libarrow.so.700.0.0
└── libarrow.so.700.0.0

0 directories, 3 files

$ cmake --install .

建立建置時,除了預設配置定義的選項外,還可以傳遞自訂選項,例如

$ cmake .. --preset ninja-debug-minimal -DCMAKE_INSTALL_PREFIX=/usr/local

注意

CMake 預設配置旨在協助您開始 Arrow 開發並理解常見的建置組態。它們不保證是不可變的,但未來可能會根據回饋進行變更。

強烈建議自動化建置、持續整合、發布腳本等使用手動組態,而不是依賴 CMake 預設配置,如下所述。

手動組態#

建置系統預設使用 CMAKE_BUILD_TYPE=release,因此如果省略此參數,將會產生發布版本建置。

注意

您需要在 Windows 上建置時設定更多選項。詳情請參閱 在 Windows 上開發

有幾種可能的建置類型

  • Debug:不套用任何編譯器最佳化,並在二進位檔中新增除錯資訊。

  • RelWithDebInfo:套用編譯器最佳化,同時在二進位檔中新增除錯資訊。

  • Release:套用編譯器最佳化,並從二進位檔中移除除錯資訊。

注意

這些建置類型預設提供合適的最佳化/除錯標誌,但您可以透過指定 -DARROW_C_FLAGS_${BUILD_TYPE}=... 和/或 -DARROW_CXX_FLAGS_${BUILD_TYPE}=... 來變更它們。${BUILD_TYPE} 是建置類型的大寫形式。例如,Debug 建置類型使用 DEBUG (-DARROW_C_FLAGS_DEBUG=... / -DARROW_CXX_FLAGS_DEBUG=...),RelWithDebInfo 建置類型使用 RELWITHDEBINFO (-DARROW_C_FLAGS_RELWITHDEBINFO=... / -DARROW_CXX_FLAGS_RELWITHDEBINFO=...)。

例如,您可以將 -O3 作為 Release 建置類型的最佳化標誌,方法是傳遞 -DARROW_CXX_FLAGS_RELEASE=-O3。您可以將 -g3 作為 Debug 建置類型的除錯標誌,方法是傳遞 -DARROW_CXX_FLAGS_DEBUG=-g3

您也可以使用標準的 CMAKE_C_FLAGS_${BUILD_TYPE}CMAKE_CXX_FLAGS_${BUILD_TYPE} 變數,但建議使用 ARROW_C_FLAGS_${BUILD_TYPE}ARROW_CXX_FLAGS_${BUILD_TYPE} 變數。CMAKE_C_FLAGS_${BUILD_TYPE}CMAKE_CXX_FLAGS_${BUILD_TYPE} 變數會取代 CMake 提供的所有預設標誌,而 ARROW_C_FLAGS_${BUILD_TYPE}ARROW_CXX_FLAGS_${BUILD_TYPE} 僅附加指定的標誌,這樣可以選擇性地覆寫某些預設值。

您也可以使用標誌 -DARROW_EXTRA_ERROR_CONTEXT=ON 執行預設建置,請參閱 額外的除錯協助

最小化發布版本建置(建議使用 1GB 或更多的 RAM 來進行建置)

$ mkdir build-release
$ cd build-release
$ cmake ..
$ make -j8       # if you have 8 CPU cores, otherwise adjust
$ make install

包含單元測試的最小化除錯建置(建議使用 4GB 或更多的 RAM 來進行建置)

$ git submodule update --init --recursive
$ export ARROW_TEST_DATA=$PWD/../testing/data
$ mkdir build-debug
$ cd build-debug
$ cmake -DCMAKE_BUILD_TYPE=Debug -DARROW_BUILD_TESTS=ON ..
$ make -j8       # if you have 8 CPU cores, otherwise adjust
$ make unittest  # to run the tests
$ make install

單元測試預設不會建置。建置完成後,也可以使用 CMake 提供的 ctest 工具調用單元測試(請注意,test 依賴於 python 的可用性)。

在某些 Linux 發行版上,執行測試套件可能需要設定明確的 locale。如果您看到任何與 locale 相關的錯誤,請嘗試設定環境變數(這需要 locales 套件或等效套件)

$ export LC_ALL="en_US.UTF-8"

使用 Ninja 加速建置#

許多貢獻者使用 Ninja 建置系統 來獲得更快的建置速度。它尤其可以加速增量建置。要使用 ninja,請在調用 cmake 時傳遞 -GNinja,然後使用 ninja 命令而不是 make

Unity 建置#

CMake 的 unity builds 選項可以顯著加快完整建置速度,但也會增加記憶體需求。如果記憶體消耗不是問題,請考慮開啟它(使用 -DCMAKE_UNITY_BUILD=ON)。

可選組件#

預設情況下,C++ 建置系統會建立相當精簡的建置。我們有幾個可選的系統組件,您可以透過將布林標誌傳遞給 cmake 來選擇建置它們。

  • -DARROW_BUILD_UTILITIES=ON:建置 Arrow 命令列工具

  • -DARROW_COMPUTE=ON:建置所有計算核心函數

  • -DARROW_CSV=ON:CSV 讀取器模組

  • -DARROW_CUDA=ON:用於 GPU 開發的 CUDA 整合。依賴 NVIDIA CUDA 工具包。用於建置函式庫的 CUDA 工具鏈可以使用 $CUDA_HOME 環境變數進行自訂。

  • -DARROW_DATASET=ON:Dataset API,意味著 Filesystem API

  • -DARROW_FILESYSTEM=ON:Filesystem API,用於存取本地和遠端檔案系統

  • -DARROW_FLIGHT=ON:Arrow Flight RPC 系統,至少依賴 gRPC

  • -DARROW_FLIGHT_SQL=ON:Arrow Flight SQL

  • -DARROW_GANDIVA=ON:Gandiva 表達式編譯器,依賴 LLVM、Protocol Buffers 和 re2

  • -DARROW_GANDIVA_JAVA=ON:Gandiva JNI 綁定,適用於 Java

  • -DARROW_GCS=ON:建置支援 GCS 的 Arrow(需要 GCloud SDK for C++)

  • -DARROW_HDFS=ON:Arrow 與 libhdfs 的整合,用於存取 Hadoop 檔案系統

  • -DARROW_JEMALLOC=ON:建置基於 jemalloc 的 Arrow 分配器,預設為開啟

  • -DARROW_JSON=ON:JSON 讀取器模組

  • -DARROW_MIMALLOC=ON:建置基於 mimalloc 的 Arrow 分配器

  • -DARROW_ORC=ON:Arrow 與 Apache ORC 的整合

  • -DARROW_PARQUET=ON:Apache Parquet 函式庫與 Arrow 整合

  • -DPARQUET_REQUIRE_ENCRYPTION=ON:Parquet 模組化加密

  • -DARROW_PYTHON=ON:此選項自 10.0.0 版本起已棄用。將在未來版本中移除。請改用 CMake 預設配置。或者,您可以直接啟用 ARROW_COMPUTEARROW_CSVARROW_DATASETARROW_FILESYSTEMARROW_HDFSARROW_JSON

  • -DARROW_S3=ON:支援與 Amazon S3 相容的檔案系統

  • -DARROW_SUBSTRAIT=ON:建置支援 Substrait

  • -DARROW_WITH_RE2=ON:建置時支援使用 re2 函式庫的正規表示式,預設為開啟,並在 ARROW_COMPUTEARROW_GANDIVAON 時使用

  • -DARROW_WITH_UTF8PROC=ON:建置時支援使用 utf8proc 函式庫的 Unicode 屬性,預設為開啟,並在 ARROW_COMPUTEARROW_GANDIVAON 時使用

  • -DARROW_TENSORFLOW=ON:建置啟用 TensorFlow 支援的 Arrow

Arrow 中可用的壓縮選項包括

  • -DARROW_WITH_BROTLI=ON:建置 Brotli 壓縮支援

  • -DARROW_WITH_BZ2=ON:建置 BZ2 壓縮支援

  • -DARROW_WITH_LZ4=ON:建置 lz4 壓縮支援

  • -DARROW_WITH_SNAPPY=ON:建置 Snappy 壓縮支援

  • -DARROW_WITH_ZLIB=ON:建置 zlib (gzip) 壓縮支援

  • -DARROW_WITH_ZSTD=ON:建置 ZSTD 壓縮支援

如果您的應用程式不需要核心 Arrow 共享函式庫的某些功能,可以將其關閉以縮短建置時間

  • -DARROW_IPC=ON:建置 IPC 擴充功能

注意

如果您的使用案例僅限於讀取/寫入 Arrow 資料,則預設選項應已足夠。但是,如果您希望建置任何測試/效能基準測試,則還需要 ARROW_JSON(它將自動啟用)。如果需要擴充格式支援,則新增 ARROW_PARQUETARROW_CSVARROW_JSONARROW_ORC 不應啟用任何額外的組件。

注意

一般來說,如果您預期使用超出 cast 之外的任何計算核心,則最好啟用 ARROW_COMPUTE。雖然預設情況下內建了一些額外的核心(截至 12.0.0 版本),但此列表未來可能會變更,因為它部分基於目前格式實作中核心的使用情況。

可選目標#

對於開發建置,您通常會想要啟用額外的目標,以便測試您的變更,使用以下 cmake 選項。

  • -DARROW_BUILD_BENCHMARKS=ON:建置可執行效能基準測試。

  • -DARROW_BUILD_EXAMPLES=ON:建置使用 Arrow C++ API 的範例。

  • -DARROW_BUILD_INTEGRATION=ON:建置額外的可執行檔,用於測試不同 Arrow 實作之間的協定互通性。

  • -DARROW_BUILD_UTILITIES=ON:建置可執行工具。

  • -DARROW_BUILD_TESTS=ON:建置可執行單元測試。

  • -DARROW_ENABLE_TIMING_TESTS=ON:如果建置單元測試,則啟用那些依賴實際時間計時的單元測試(此標誌在 CI 上停用,因為它可能會使測試結果不穩定)。

  • -DARROW_FUZZING=ON:建置模糊測試目標和相關的可執行檔。

可選檢查#

以下特殊檢查也可用。它們以各種方式檢測產生的程式碼,以便在運行時(例如在執行單元測試時)檢測特定類別的問題。

  • -DARROW_USE_ASAN=ON:啟用 Address Sanitizer 以檢查記憶體洩漏、緩衝區溢位或其他類型的記憶體管理問題。

  • -DARROW_USE_TSAN=ON:啟用 Thread Sanitizer 以檢查多執行緒程式碼中的競爭條件。

  • -DARROW_USE_UBSAN=ON:啟用 Undefined Behavior Sanitizer 以檢查觸發 C++ 未定義行為的情況。

其中一些選項彼此不相容,因此如果您想測試所有選項,可能需要使用不同的選項建置多次。

CMake 版本需求#

我們支援 CMake 3.16 及更高版本。

LLVM 和 Clang 工具#

我們目前使用 LLVM 進行函式庫建置,以及其他開發人員工具,例如使用 clang-format 進行程式碼格式化。LLVM 可以透過大多數現代套件管理器(apt、yum、conda、Homebrew、vcpkg、chocolatey)安裝。

建置依賴管理#

建置系統支援許多第三方依賴項

  • AWSSDK:用於 S3 支援,需要系統 cURL,並且可以使用下面描述的 BUNDLED 方法

  • benchmark:Google benchmark,用於測試

  • Boost:用於跨平台支援

  • Brotli:用於資料壓縮

  • BZip2:用於資料壓縮

  • c-ares:gRPC 的依賴項

  • gflags:用於命令列工具(以前稱為 Googleflags)

  • GLOG:用於日誌記錄

  • google_cloud_cpp_storage:用於 Google Cloud Storage 支援,需要系統 cURL,並且可以使用下面描述的 BUNDLED 方法

  • gRPC:用於遠端程序調用

  • GTest:Googletest,用於測試

  • LLVM:Gandiva 的依賴項

  • Lz4:用於資料壓縮

  • ORC:用於 Apache ORC 格式支援

  • re2:用於計算核心和 Gandiva,gRPC 的依賴項

  • Protobuf:Google Protocol Buffers,用於資料序列化

  • RapidJSON:用於資料序列化

  • Snappy:用於資料壓縮

  • Thrift:Apache Thrift,用於資料序列化

  • utf8proc:用於計算核心

  • ZLIB:用於資料壓縮

  • zstd:用於資料壓縮

CMake 選項 ARROW_DEPENDENCY_SOURCE 是一個全域選項,用於指示建置系統如何解析每個依賴項。有幾個選項

  • AUTO:嘗試在系統預設位置尋找套件,如果找不到則從源碼建置

  • BUNDLED:自動從源碼建置依賴項

  • SYSTEM:使用 CMake 的內建 find_package 函數在系統路徑中尋找依賴項,或對於不具備此功能的套件使用 pkg-config

  • CONDA:使用 $CONDA_PREFIX 作為替代的 SYSTEM 路徑

  • VCPKG:尋找 vcpkg 安裝的依賴項,如果找不到,則執行 vcpkg install 來安裝它們

  • BREW:使用 Homebrew 預設路徑作為替代的 SYSTEM 路徑

預設方法是 AUTO,除非您在活動的 conda 環境中開發(透過 $CONDA_PREFIX 環境變數的存在來偵測),在這種情況下,預設方法是 CONDA

個別依賴項解析#

雖然 -DARROW_DEPENDENCY_SOURCE=$SOURCE 為所有套件設定了全域預設值,但可以透過設定 -D$PACKAGE_NAME_SOURCE=.. 來覆寫個別套件的解析策略。例如,要從源碼建置 Protocol Buffers,請設定

-DProtobuf_SOURCE=BUNDLED

不幸的是,此變數區分大小寫;每個套件使用的名稱在上面列出,但最新的列表可以在 cpp/cmake_modules/ThirdpartyToolchain.cmake 中找到。

捆綁依賴項版本#

當使用 BUNDLED 方法從源碼建置依賴項時,將使用 cpp/thirdparty/versions.txt 中的版本號碼。還有一個依賴項源碼下載器腳本(見下文),可用於設定離線建置。

當使用 BUNDLED 進行依賴項解析時(如果您使用建議的 jemalloc 或 mimalloc 分配器),在第三方專案中靜態連結 Arrow 函式庫會更複雜。請參閱下文,了解在這種情況下如何組態您的建置系統的說明。

離線建置#

如果您不使用上述變數來指示 Arrow 建置系統使用預先安裝的依賴項,它們將由 Arrow 建置系統自動建置。每個依賴項的源碼歸檔將透過網際網路下載,這可能會在網際網路存取受限的環境中造成問題。

要啟用離線建置,您可以自行下載源碼成品,並使用 ARROW_$LIBRARY_URL 形式的環境變數,以指示建置系統從本機檔案讀取而不是存取網際網路。

為了讓您更輕鬆,我們準備了一個腳本 thirdparty/download_dependencies.sh,它會將每個依賴項的正確版本下載到您選擇的目錄中。它將在末尾列印 bash 樣式的環境變數語句列表,以用於您的建置腳本。

# Download tarballs into $HOME/arrow-thirdparty
$ ./thirdparty/download_dependencies.sh $HOME/arrow-thirdparty

然後,您可以調用 CMake 來建立建置目錄,它將使用宣告的環境變數指向已下載的歸檔,而不是下載它們(每個建置目錄一個!)。

靜態連結#

-DARROW_BUILD_STATIC=ON 時,由 Arrow 建置系統建置為靜態函式庫的所有建置依賴項將合併在一起,以建立一個靜態函式庫 arrow_bundled_dependencies。在類 UNIX 環境(Linux、macOS、MinGW)中,這稱為 libarrow_bundled_dependencies.a,在 Windows 上使用 Visual Studio 則稱為 arrow_bundled_dependencies.lib。這個「依賴項捆綁」函式庫與其他 Arrow 靜態函式庫安裝在相同的位置。

如果您使用 CMake,當您使用 arrow_static CMake 目標進行連結時,捆綁的依賴項將會自動包含在內。在其他建置系統中,您可能需要明確地連結到依賴項捆綁包。我們建立了一個CMake 基礎的建置配置範例,向您展示一個可運作的範例。

在 Linux 和 macOS 上,如果您的應用程式尚未連結到 pthread 函式庫,您必須在您的連結器設定中包含 -pthread。在 CMake 中,這可以使用 Threads 內建套件來完成。

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(my_target PRIVATE Threads::Threads)

額外的偵錯幫助#

如果您使用 CMake 選項 -DARROW_EXTRA_ERROR_CONTEXT=ON,它將會在 RETURN_NOT_OK 巨集內的錯誤檢查中,編譯包含額外偵錯資訊的函式庫。在具有 ASSERT_OK 的單元測試中,這將產生類似以下的錯誤輸出:

../src/arrow/ipc/ipc-read-write-test.cc:609: Failure
Failed
../src/arrow/ipc/metadata-internal.cc:508 code: TypeToFlatbuffer(fbb, *field.type(), &children, &layout, &type_enum, dictionary_memo, &type_offset)
../src/arrow/ipc/metadata-internal.cc:598 code: FieldToFlatbuffer(fbb, *schema.field(i), dictionary_memo, &offset)
../src/arrow/ipc/metadata-internal.cc:651 code: SchemaToFlatbuffer(fbb, schema, dictionary_memo, &fb_schema)
../src/arrow/ipc/writer.cc:697 code: WriteSchemaMessage(schema_, dictionary_memo_, &schema_fb)
../src/arrow/ipc/writer.cc:730 code: WriteSchema()
../src/arrow/ipc/writer.cc:755 code: schema_writer.Write(&dictionaries_)
../src/arrow/ipc/writer.cc:778 code: CheckStarted()
../src/arrow/ipc/ipc-read-write-test.cc:574 code: writer->WriteRecordBatch(batch)
NotImplemented: Unable to convert type: decimal(19, 4)

棄用和 API 變更#

我們使用巨集 ARROW_DEPRECATED,它為已棄用的 API 包裝了 C++ deprecated 屬性。建議的做法是使用 -Werror=deprecated-declarations (適用於 GCC/Clang 或其他編譯器的類似標誌) 編譯第三方應用程式,以主動捕捉並考量 API 變更。

模組化建置目標#

由於 C++ 專案有幾個主要部分,我們為建置每個函式庫組件、單元測試和基準測試群組及其依賴項,提供了模組化的 CMake 目標。

  • make arrow 用於 Arrow 核心函式庫

  • make parquet 用於 Parquet 函式庫

  • make gandiva 用於 Gandiva (LLVM 表達式編譯器) 函式庫

注意

如果您已選擇 Ninja 作為 CMake 產生器,請將 make arrow 替換為 ninja arrow,依此類推。

若要建置單元測試或基準測試,請將 -tests-benchmarks 新增至目標名稱。因此,make arrow-tests 將會建置 Arrow 核心單元測試。使用 -all 目標,例如 parquet-all,將會建置所有項目。

如果您希望僅建置和安裝一個或多個專案子組件,我們提供了 CMake 選項 ARROW_OPTIONAL_INSTALL,僅安裝已建置的目標。例如,如果您只希望建置 Parquet 函式庫、其測試及其依賴項,您可以執行

cmake .. -DARROW_PARQUET=ON \
      -DARROW_OPTIONAL_INSTALL=ON \
      -DARROW_BUILD_TESTS=ON
make parquet
make install

如果您在調用 make 時省略明確的目標,則將會建置所有目標。

在 macOS 上使用 Xcode 偵錯#

Xcode 是 macOS 提供的 IDE,可用於透過產生 Xcode 專案來開發和偵錯 Arrow。

cd cpp
mkdir xcode-build
cd xcode-build
cmake .. -G Xcode -DARROW_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=DEBUG
open arrow.xcodeproj

這將產生一個專案並在 Xcode 應用程式中開啟它。作為替代方案,命令 xcodebuild 將使用產生的專案執行命令列建置。建議在首次啟動專案時使用 “自動建立 Schemes” 選項。選擇自動產生的 scheme 將允許您建置和執行啟用斷點的單元測試。