blob: dcd6d0bf58f172562804394d49b3734a3097eb17 [file] [view]
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# Apache IoTDB C++ Client
[中文说明](README_zh.md)
This directory builds and packages the Apache IoTDB C++ Session SDK. If you
already have an `iotdb-session-cpp-<version>-<classifier>.zip` package, you do
not need Maven, Thrift, Boost, or this source tree to use it in your own
application. Unpack the zip, point your build system at its `include/` and
`lib/` directories, and deploy the IoTDB runtime library with your executable.
## Use a packaged SDK in your project
### 1. Pick and unpack the right package
Choose the zip whose classifier matches the machine where the application will
run:
| Target environment | Zip classifier (suffix) |
|--------------------|-------------------------|
| Linux x86_64, glibc >= 2.28 | `linux-x86_64-glibc2.28` |
| Linux aarch64, glibc >= 2.28 | `linux-aarch64-glibc2.28` |
| macOS x86_64 | `macos-x86_64` |
| macOS arm64 | `macos-aarch64` |
| Windows + Visual Studio 2017 | `windows-x86_64-msvc14.1` |
| Windows + Visual Studio 2019 | `windows-x86_64-msvc14.2` |
| Windows + Visual Studio 2022 | `windows-x86_64-msvc14.3` |
| Windows + Visual Studio 2026 | `windows-x86_64-msvc14.4` |
Example:
```bash
unzip iotdb-session-cpp-2.0.7-SNAPSHOT-linux-x86_64-glibc2.28.zip
export IOTDB_SESSION_HOME=$PWD/iotdb-session-cpp-2.0.7-SNAPSHOT-linux-x86_64-glibc2.28
```
The unpacked SDK contains public headers, one runtime library, CMake and
pkg-config metadata, and examples:
```
include/ public C and C++ API headers
lib/ libiotdb_session.so/.dylib or iotdb_session.dll + .lib
cmake/iotdb-session-config.cmake CMake package config
pkgconfig/iotdb-session.pc pkg-config metadata
examples/ sample source files and an example CMakeLists.txt
third_party/DEPENDENCIES.md bundled third-party dependency notes
```
Thrift and Boost are embedded into `iotdb_session`; applications do not install
separate Thrift or Boost headers/libraries for normal SDK use.
### 2. Link with CMake
```cmake
cmake_minimum_required(VERSION 3.15)
project(my_iotdb_app LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(iotdb-session REQUIRED CONFIG)
add_executable(my_iotdb_app main.cpp)
target_link_libraries(my_iotdb_app PRIVATE IoTDB::iotdb_session)
```
Configure with the SDK prefix:
```bash
cmake -S . -B build -DCMAKE_PREFIX_PATH="$IOTDB_SESSION_HOME"
cmake --build build
```
On Windows, use the same Visual Studio generation as the SDK package. For
example, link a `windows-x86_64-msvc14.3` package with Visual Studio 2022.
Visual Studio users can either open the project folder and add the unpacked SDK
directory to `CMAKE_PREFIX_PATH` in CMake cache settings, or configure from a
Developer Command Prompt:
```bat
cmake -S . -B build -G "Visual Studio 17 2022" -A x64 ^
-DCMAKE_PREFIX_PATH="%IOTDB_SESSION_HOME%"
cmake --build build --config Release
copy "%IOTDB_SESSION_HOME%\lib\iotdb_session.dll" build\Release\
```
### 3. Link with pkg-config on Linux/macOS
```bash
export PKG_CONFIG_PATH="$IOTDB_SESSION_HOME/pkgconfig:$PKG_CONFIG_PATH"
c++ -std=c++11 main.cpp $(pkg-config --cflags --libs iotdb-session) -o my_iotdb_app
```
When running from a directory that does not already know where the shared
library is, either copy the runtime library next to the executable or set the
library search path:
```bash
cp -P "$IOTDB_SESSION_HOME"/lib/libiotdb_session.so* .
./my_iotdb_app
# Or:
LD_LIBRARY_PATH="$IOTDB_SESSION_HOME/lib:$LD_LIBRARY_PATH" ./my_iotdb_app
```
### 4. Link manually
Linux:
```bash
c++ -std=c++11 main.cpp \
-I"$IOTDB_SESSION_HOME/include" \
-L"$IOTDB_SESSION_HOME/lib" \
-liotdb_session -pthread \
-Wl,-rpath,"$IOTDB_SESSION_HOME/lib" \
-o my_iotdb_app
```
macOS:
```bash
c++ -std=c++11 main.cpp \
-I"$IOTDB_SESSION_HOME/include" \
-L"$IOTDB_SESSION_HOME/lib" \
-liotdb_session \
-Wl,-rpath,"$IOTDB_SESSION_HOME/lib" \
-o my_iotdb_app
```
Windows with MSVC:
```bat
cl /std:c++14 /EHsc main.cpp /I "%IOTDB_SESSION_HOME%\include" ^
/link /LIBPATH:"%IOTDB_SESSION_HOME%\lib" iotdb_session.lib
copy "%IOTDB_SESSION_HOME%\lib\iotdb_session.dll" .
```
### 5. Build the bundled examples
The package includes example sources under `examples/`. From the unpacked SDK
root:
```bash
cmake -S examples -B examples-build -DCMAKE_BUILD_TYPE=Release
cmake --build examples-build
```
On Windows:
```bat
cmake -S examples -B examples-build -G "Visual Studio 17 2022" -A x64
cmake --build examples-build --config Release
```
The example build copies the IoTDB runtime library next to each example
executable. `cmake --build examples-build --target example-dist` also creates a
`dist/` folder containing the examples and runtime library.
### 6. Minimal C++ program
```cpp
#include "Session.h"
#include <iostream>
#include <memory>
int main() {
auto session = std::make_shared<Session>("127.0.0.1", 6667, "root", "root");
session->open(false);
session->setStorageGroup("root.test");
if (!session->checkTimeseriesExists("root.test.d0.s0")) {
session->createTimeseries(
"root.test.d0.s0", TSDataType::INT64, TSEncoding::RLE, CompressionType::SNAPPY);
}
session->close();
std::cout << "IoTDB C++ session is ready." << std::endl;
return 0;
}
```
The examples in the package connect to `127.0.0.1:6667` with `root` / `root`
by default. Start IoTDB before running them.
### Runtime deployment notes
- Linux release packages are built in the `manylinux_2_28` container and require
glibc 2.28 or newer.
- Windows packages use the dynamic MSVC runtime (`/MD`). Install the Microsoft
Visual C++ Redistributable matching your Visual Studio generation on target
machines that do not already have it.
- Put `libiotdb_session.so`, `libiotdb_session.dylib`, or `iotdb_session.dll`
next to your executable, or configure the platform library search path. On
Linux, keep the `libiotdb_session.so*` symlink chain together when copying
files manually.
## Build the SDK from source
The C++ client is built by a single top-level `CMakeLists.txt` in this
directory. The outer Maven POM is a thin wrapper that invokes CMake; you can
also build the client standalone with just `cmake` if you don't have Maven
available.
### Build layout at a glance
```
iotdb-client/client-cpp/
├── CMakeLists.txt # single entry point - manages everything
├── cmake/ # helpers (FetchBoost / FetchThrift / ...)
├── third-party/ # local tarball cache (one sub-dir per OS)
│ ├── linux/ mac/ windows/
├── src/include/ # public API headers (installed to include/)
├── src/session/ # Session / Table / C API implementation (.cpp)
├── src/rpc/ # Thrift RPC layer (private, not installed)
├── test/ # Catch2-based integration tests
└── pom.xml # Maven wrapper (cmake-maven-plugin)
```
During configure CMake will, in order:
1. Resolve Boost headers (`find_package` → local `third-party/<os>/` tarball →
download from `archives.boost.io` when not in offline mode).
2. On Linux/macOS, ensure `m4` / `flex` / `bison` are available; if not,
build them from local tarballs into `build/tools/bin` (no `sudo`
required).
3. Build a static Apache Thrift from source (tarball cache → download fallback).
4. Run the produced `thrift` compiler on
`iotdb-protocol/thrift-{commons,datanode}/src/main/thrift/*.thrift`.
5. Compile `iotdb_session` (the C/C++ session library) and, optionally,
the Catch2 integration test binaries.
6. `cmake --install` lays out the SDK under `target/install/{include,lib}`,
which Maven's assembly step packages into a zip.
### Build matrix
| Goal | Command |
|-------------------------------|--------------------------------------------------------------------------------------------------------|
| Library only (Linux/macOS) | `mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests package` |
| Debug library (Linux/macOS) | `mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests -Dcmake.build.type=Debug package` |
| Library only (Windows / MSVC) | `mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests "-Dboost.include.dir=C:\boost_1_88_0" package` |
| Debug library (Windows / MSVC) | `mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests "-Dcmake.build.type=Debug" "-Dboost.include.dir=C:\boost_1_88_0" package` |
| Library + ITs (Linux/macOS) | `mvn clean install -P with-cpp -pl distribution,iotdb-client/client-cpp -am` then `mvn -P with-cpp -pl iotdb-client/client-cpp -am verify` |
| Direct CMake (no Maven) | `cmake -S iotdb-client/client-cpp -B build && cmake --build build --target install` |
The Maven build sets `cmake.install.prefix` to `target/install/`. Output zips
land at `iotdb-client/client-cpp/target/iotdb-session-cpp-<version>-<classifier>.zip`
(with a package root directory and a `.sha512` checksum generated alongside).
The classifier can be overridden with `-Dclient.cpp.package.classifier=...` when
building multiple toolchains on the same platform.
### Release packages (CI)
The [C++ Client package](../../.github/workflows/client-cpp-package.yml) workflow
builds one zip per platform/toolchain. Pick the artifact that matches your
deployment environment:
| Target environment | Zip classifier (suffix) |
|--------------------|-------------------------|
| Linux x86_64, glibc >= 2.28 | `linux-x86_64-glibc2.28` |
| Linux aarch64, glibc >= 2.28 | `linux-aarch64-glibc2.28` |
| macOS x86_64 | `macos-x86_64` |
| macOS arm64 | `macos-aarch64` |
| Windows + Visual Studio 2017 | `windows-x86_64-msvc14.1` |
| Windows + Visual Studio 2019 | `windows-x86_64-msvc14.2` |
| Windows + Visual Studio 2022 | `windows-x86_64-msvc14.3` |
| Windows + Visual Studio 2026 | `windows-x86_64-msvc14.4` |
Example file name:
`iotdb-session-cpp-2.0.10.1-linux-x86_64-glibc2.28.zip`.
Linux release packages are built in the `manylinux_2_28` containers with GCC 14,
so they require glibc 2.28 or newer on the deployment host.
| Architecture | manylinux_2_28 image |
|--------------|----------------------|
| x86_64 | `quay.io/pypa/manylinux_2_28_x86_64` |
| i686 | `quay.io/pypa/manylinux_2_28_i686` |
| aarch64 | `quay.io/pypa/manylinux_2_28_aarch64` |
| ppc64le | `quay.io/pypa/manylinux_2_28_ppc64le` |
| s390x | `quay.io/pypa/manylinux_2_28_s390x` |
Thrift **0.21.0** is compiled from source during the CMake configure step (see
`cmake/FetchThrift.cmake`). Older releases that used pre-built
`iotdb-tools-thrift` Maven artifacts and `-Diotdb-tools-thrift.version=...`
for glibc/MSVC compatibility apply only to the **legacy** client-cpp build;
with the current CMake build, compatibility is determined by the **compiler
and OS used to build** the SDK, not by that Maven property.
### Local build for a specific classifier
Linux x86_64 (glibc 2.28 baseline, matching the manylinux_2_28 release build):
```bash
mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests \
-Dclient.cpp.package.classifier=linux-x86_64-glibc2.28 package
```
Debug build:
```bash
mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests \
-Dcmake.build.type=Debug package
```
Direct CMake Debug builds use the same build type. On Linux/macOS, pass
`-DCMAKE_BUILD_TYPE=Debug` during configure. On Windows with Visual Studio,
also pass `-DCMAKE_BUILD_TYPE=Debug` during configure so the bundled Thrift
static library is built with the Debug MSVC runtime, then build with
`--config Debug`:
```bash
# Linux/macOS
cmake -S iotdb-client/client-cpp -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build --target install
# Windows / Visual Studio
cmake -S iotdb-client/client-cpp -B build -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Debug
cmake --build build --config Debug --target install
```
Windows (match the Visual Studio version you use to build your application):
```powershell
# Visual Studio 2022 (default on recent Windows)
mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests package
# Visual Studio 2019
mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests `
"-Dcmake.generator=Visual Studio 16 2019" `
"-Dclient.cpp.package.classifier=windows-x86_64-msvc14.2" package
# Visual Studio 2017 (CMake uses -A x64 on Windows automatically)
mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests `
"-Dcmake.generator=Visual Studio 15 2017" `
"-Dclient.cpp.package.classifier=windows-x86_64-msvc14.1" package
```
On Windows, the build passes `-DCMAKE_GENERATOR_PLATFORM=x64` so Visual Studio
generators target **x64** (VS2017 otherwise defaults to Win32).
## CMake options
The table below lists CMake cache variables. When building through **Maven**,
pass them as Maven properties (the POM maps them to `-D` options for CMake):
| CMake variable | Maven property (`-D...`) |
|----------------|--------------------------|
| `WITH_SSL` | `with.ssl` (e.g. `-Dwith.ssl=ON`) |
| `IOTDB_OFFLINE` | `iotdb.offline` |
| `BUILD_TESTING` | `build.tests` |
| `IOTDB_DEPS_DIR` | `iotdb.deps.dir` |
| `BOOST_INCLUDEDIR` | `boost.include.dir` (legacy alias) |
| `CMAKE_BUILD_TYPE` | `cmake.build.type` (e.g. `-Dcmake.build.type=Debug`) |
For a **standalone** `cmake` configure, pass `-DWITH_SSL=ON`, `-DIOTDB_OFFLINE=ON`,
etc. directly.
| Option | Default | Purpose |
|-----------------------|----------------------------------|----------------------------------------------------------------------------------------------------------|
| `WITH_SSL` | `OFF` | Link against OpenSSL. See *SSL* below. |
| `BUILD_TESTING` | `OFF` (Maven sets `ON` for verify) | Build Catch2 IT executables (Catch2 v2.13.7 header downloaded at configure time). |
| `CATCH2_INCLUDE_DIR` | (unset) | Pre-downloaded Catch2 include dir (Maven sets this under `target/test/catch2`). |
| `IOTDB_OFFLINE` | `OFF` | Disallow any network access during configure. |
| `IOTDB_DEPS_DIR` | `<client-cpp>/third-party` | Override the local tarball cache directory. |
| `BOOST_VERSION` | `1.60.0` (`1.84.0` on macOS) | Boost version that CMake will look for / download. |
| `THRIFT_VERSION` | `0.21.0` | Apache Thrift version to build from source. |
| `BOOST_ROOT` | (unset) | Existing Boost install to reuse, equivalent to `-Dboost.include.dir=...` from the legacy build. |
| `OPENSSL_ROOT_DIR` | (unset) | Existing OpenSSL install when `WITH_SSL=ON`. |
| `CMAKE_INSTALL_PREFIX`| `<build>/install` | Install location. |
| `CMAKE_BUILD_TYPE` | `Release` | Single-config generator build type. Use `Debug` to produce a debug library. |
For Visual Studio generators on Windows, still set `CMAKE_BUILD_TYPE=Debug`
when configuring a Debug SDK build. The top-level project uses that value to
build bundled third-party static libraries, while `cmake --build --config Debug`
selects the final Visual Studio configuration.
## Online build (default)
CMake will download any missing tarball at configure time. The first run is
slow (≈100 MB download + a Thrift build); subsequent runs reuse the
extracted artifacts under `build/_deps/`.
```bash
# Linux / macOS
mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests package
# Windows (Developer Command Prompt for VS, PowerShell, or cmd)
mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests "-Dboost.include.dir=C:\boost_1_88_0" package
```
Standalone CMake uses the same online dependency resolution:
```bash
# Linux / macOS
cmake -S iotdb-client/client-cpp -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
# Windows / Visual Studio
cmake -S iotdb-client/client-cpp -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release --target install
```
## Offline build
1. Pre-populate the platform-specific sub-directory under `third-party/`:
| Platform | Required files |
|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `linux/` | `thrift-0.21.0.tar.gz`, `boost_1_60_0.tar.gz`, `m4-1.4.19.tar.gz`, `flex-2.6.4.tar.gz`, `bison-3.8.tar.gz` (and `openssl-3.5.0.tar.gz` when `WITH_SSL=ON`) |
| `mac/` | `thrift-0.21.0.tar.gz`, `boost_1_84_0.tar.gz` (newer Boost for Xcode/Clang; Apple ships m4/flex/bison; `openssl-3.5.0.tar.gz` optional) |
| `windows/` | `thrift-0.21.0.tar.gz`, `boost_1_60_0.tar.gz` (Boost headers only - no `b2` build required for `iotdb_session`) |
Reference URLs (the configure step uses the same):
- Apache Thrift 0.21.0: <https://archive.apache.org/dist/thrift/0.21.0/thrift-0.21.0.tar.gz>
- Boost 1.60.0: <https://archives.boost.io/release/1.60.0/source/boost_1_60_0.tar.gz>
- GNU m4 1.4.19: <https://ftp.gnu.org/gnu/m4/m4-1.4.19.tar.gz>
- GNU flex 2.6.4: <https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz>
- GNU bison 3.8: <https://ftp.gnu.org/gnu/bison/bison-3.8.tar.gz>
- OpenSSL 3.5.0: <https://www.openssl.org/source/openssl-3.5.0.tar.gz>
2. Run the build with offline mode enabled:
```bash
mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests \
-Diotdb.offline=ON package
```
or, going straight through CMake:
```bash
cmake -S iotdb-client/client-cpp -B build -DIOTDB_OFFLINE=ON
cmake --build build --config Release --target install
```
CI environments can share a single cache by setting
`-DIOTDB_DEPS_DIR=/path/to/cache` instead of copying tarballs around.
## Platform-specific notes
### Linux
- Tested with GCC 7+ and Clang 9+. Anything that can compile Apache Thrift
0.21.0 works.
- Build deps that must already exist on the host (only required when
CMake auto-builds m4/flex/bison from tarball): `make`, `autoconf`,
`gcc`, plus the standard C/C++ toolchain. `sudo` is **not** required;
the helper tools install under `build/tools/`.
- If you would rather use distro-provided tools (`apt install m4 flex
bison`), CMake will pick them up first.
### macOS
- Xcode Command Line Tools provide `m4`, `flex`, `bison`, and `make`,
so the auto-build path normally skips them.
- Homebrew users can `brew install boost` to short-circuit `FetchBoost`.
### Windows
Visual Studio **2017, 2019, 2022, or 2026** is supported for building the SDK.
Link your application against the zip built with the **same VS generation** you
use for your project.
Prerequisites:
1. **Boost.** Download and extract
<https://archives.boost.io/release/1.88.0/source/boost_1_88_0.zip>
(any 1.60+ release will work). `iotdb_session` only needs Boost
headers, so running `bootstrap.bat` / `b2` is optional. Pass the
location with either `-Dboost.include.dir="C:\boost_1_88_0"` (Maven)
or `-DBOOST_ROOT="C:\boost_1_88_0"` (raw CMake).
2. **flex / bison.** Install <https://sourceforge.net/projects/winflexbison/>
and rename `win_flex.exe`→`flex.exe`, `win_bison.exe`→`bison.exe` on
`PATH`.
3. **OpenSSL** *(only when `WITH_SSL=ON`)*: run the Win64 OpenSSL
installer from <https://slproweb.com/products/Win32OpenSSL.html>, then
pass `-DOPENSSL_ROOT_DIR=...` to CMake.
On Windows the SDK ships as **`iotdb_session.dll`** plus an import library
**`iotdb_session.lib`**, built with **`/MD`** (dynamic CRT, same as a
default Visual Studio application). Thrift is linked into the DLL; users
do not install separate Thrift headers or libraries. Place
`iotdb_session.dll` next to your `.exe` or on `PATH`.
Auto-building m4/flex/bison from tarball is **not** supported on Windows;
the GNU autotools tarballs assume a POSIX shell environment.
## SSL
Both Thrift and `iotdb_session` build without OpenSSL by default. Enable
SSL with `-Dwith.ssl=ON` (Maven) or `-DWITH_SSL=ON` (standalone CMake).
CMake first calls `find_package(OpenSSL)`;
if nothing is found, it falls back to:
- **Linux / macOS** – use a local `openssl-<ver>.tar.gz` (or download it
when not in offline mode), configure with `no-shared`, install into
`build/_deps/openssl/install`, and link statically.
- **Windows** – fail with a friendly message that points at the Win64
OpenSSL installer. Building OpenSSL from source via MSVC is out of scope.
## Tests
Maven binds `cmake-maven-plugin`'s `test` goal to the `integration-test`
phase and runs `ctest`. `pre-integration-test` spawns a local IoTDB server
from `distribution/target/.../sbin/start-standalone.{sh,bat}`, so make sure
the distribution module is built first:
```bash
mvn clean install -P with-cpp -pl distribution,iotdb-client/client-cpp -am -DskipTests
mvn -P with-cpp -pl iotdb-client/client-cpp -am verify
```
Running ctest directly (after a `mvn ... package` build) is also supported:
```bash
cd iotdb-client/client-cpp/target/build
ctest --output-on-failure
```
## Code formatting
We use `clang-format` (pinned by the root POM as `clang.format.version`)
through Maven Spotless. **clang-format 17.0.6** is the version CI runs.
```bash
mvn -P with-cpp -pl iotdb-client/client-cpp spotless:check
mvn -P with-cpp -pl iotdb-client/client-cpp spotless:apply
```
On JDK 8 the C++ Spotless profile is skipped automatically (Spotless's
clang-format integration requires Spotless 2.44+, which itself requires
JDK 11+).
## Package layout
A successful `mvn ... package` produces
`target/iotdb-session-cpp-<version>-<classifier>.zip` with this layout:
```
README.md
README_zh.md
LICENSE
NOTICE
VERSION
BUILD-INFO.txt
include/
├── Session.h
├── SessionC.h
└── ... (public API headers only; no Thrift/Boost)
lib/
├── libiotdb_session.{so,dylib} (Linux / macOS)
├── iotdb_session.dll (Windows – runtime)
└── iotdb_session.lib (Windows – import library for linking)
third_party/
└── DEPENDENCIES.md
cmake/
└── iotdb-session-config.cmake
pkgconfig/
└── iotdb-session.pc
examples/
├── CMakeLists.txt
└── ...
```
Thrift is embedded inside `iotdb_session` on all platforms; it is not shipped
as a separate install artifact.
For full API documentation see the [C++ Native API guide](https://iotdb.apache.org/UserGuide/latest/API/Programming-Cpp-Native-API.html).