| <!-- | |
| 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. | |
| --> | |
| # IoTDB C++ client examples | |
| [中文说明](README_zh.md) | |
| Sample programs that link against the pre-built **IoTDB C++ Session SDK** | |
| (`iotdb_session`). Thrift and Boost are **not** required at application compile | |
| time; they are embedded inside the SDK shared library. | |
| All examples connect to a running IoTDB instance (default `127.0.0.1:6667`, | |
| user `root` / `root`). | |
| | Example | Description | | |
| |---------|-------------| | |
| | `SessionExample` | Tree model: DDL, insert, query, delete | | |
| | `AlignedTimeseriesSessionExample` | Aligned time series and templates | | |
| | `TableModelSessionExample` | Table (relational) model | | |
| | `MultiSvrNodeClient` | Multi-node insert/query loop | | |
| | `tree_example` | C Session API (tree model) | | |
| | `table_example` | C Session API (table model) | | |
| ## Which SDK zip to use | |
| Release CI ([client-cpp-package.yml](../../.github/workflows/client-cpp-package.yml)) | |
| publishes one zip per platform/toolchain: | |
| `iotdb-session-cpp-<version>-<classifier>.zip` (package root contains `include/` and `lib/`). | |
| | Deployment target | 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 (match your Visual Studio version) | `windows-x86_64-msvc14.1` ... `msvc14.4` | | |
| The current build compiles Thrift 0.24 from source at CMake configure time. | |
| Legacy `-Diotdb-tools-thrift.version=...` flags applied to the **old** | |
| pre-built Thrift workflow only. Linux release packages are built in the | |
| `manylinux_2_28` container and require glibc 2.28 or newer. See | |
| [client-cpp README](../../iotdb-client/client-cpp/README.md). | |
| ## SDK layout (after unpack) | |
| The SDK zip produced by `client-cpp` contains **public headers only** and one | |
| shared library: | |
| ``` | |
| client/ | |
| ├── include/ | |
| │ ├── Session.h | |
| │ ├── Export.h | |
| │ └── ... | |
| └── lib/ | |
| ├── iotdb_session.dll + iotdb_session.lib (Windows) | |
| ├── libiotdb_session.so (Linux) | |
| └── libiotdb_session.dylib (macOS) | |
| ``` | |
| ## Build the examples | |
| ### Option A – Maven (recommended in this repo) | |
| From the repository root: | |
| ```bash | |
| mvn clean verify -P with-cpp -pl iotdb-client/client-cpp -am | |
| ``` | |
| Maven builds the C++ client, starts a local IoTDB server for the verify phase, | |
| and runs the C++ tests plus runnable examples through CTest. Example binaries | |
| are under `iotdb-client/client-cpp/target/build/examples/` (or | |
| `target/build/examples/Release/` with Visual Studio). | |
| ### Option B – CMake only (manual SDK) | |
| 1. Build or download the SDK and unpack it so `client/include` and | |
| `client/lib` exist (see layout above). | |
| 2. Use this `examples/` directory as the source tree and place `client/` beside | |
| it, or pass `-DIOTDB_SDK_ROOT=/path/to/iotdb-session-cpp-...`. | |
| 3. Configure and build: | |
| ```bash | |
| cmake -S iotdb-client/client-cpp/examples -B build \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DIOTDB_SDK_ROOT=/path/to/iotdb-session-cpp-... | |
| cmake --build build | |
| ``` | |
| Windows (Visual Studio generator): | |
| ```powershell | |
| cmake -S . -B build -A x64 | |
| cmake --build build --config Release | |
| ``` | |
| Each executable is built with the IoTDB runtime library copied **next to the | |
| `.exe` / binary** (POST_BUILD step). Linux/macOS binaries use `$ORIGIN` rpath | |
| so they resolve the `.so` / `.dylib` in the same directory. | |
| Optional staging folder for deployment: | |
| ```bash | |
| cmake --build build --target example-dist | |
| # -> build/dist/ contains all example binaries + libiotdb_session.{so,dll,dylib} | |
| ``` | |
| ## Run on a clean machine (no compiler, no IoTDB SDK headers) | |
| You only need: | |
| 1. A running IoTDB server reachable from the machine. | |
| 2. The **example executable(s)** and the **IoTDB runtime library** in the | |
| **same directory** (or on the system library path). | |
| Copy either from `build/.../Release/` (Windows) / `build/` (Ninja/Make) or from | |
| `build/dist/` after `example-dist`. | |
| ### Windows | |
| **Files to copy** | |
| ``` | |
| SessionExample.exe | |
| iotdb_session.dll | |
| ``` | |
| (Repeat for the other example names if needed.) | |
| **Prerequisites on the target PC** | |
| - **64-bit Windows** (examples are built x64). | |
| - **[Microsoft Visual C++ Redistributable for Visual Studio 2015–2022](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist)** | |
| (x64). The SDK and examples are built with **`/MD`**; the redistributable | |
| supplies `vcruntime140.dll`, `msvcp140.dll`, etc. | |
| Installing this package is enough—you do **not** need Visual Studio or the | |
| IoTDB SDK on the target machine. | |
| **Run** | |
| ```powershell | |
| .\SessionExample.exe | |
| ``` | |
| If you see “The code execution cannot proceed because VCRUNRuntime140.dll was | |
| missing”, install the VC++ redistributable above. | |
| You do **not** need a separate Thrift or Boost runtime; they are inside | |
| `iotdb_session.dll`. | |
| ### Linux | |
| **Files to copy** | |
| ``` | |
| SessionExample | |
| libiotdb_session.so | |
| chmod +x SessionExample | |
| ``` | |
| **Prerequisites on the target machine** | |
| - **glibc** on the target must be **≥ the glibc version on the machine that | |
| built the SDK** (backward compatible only in that direction). | |
| Check **build machine** (record in release notes): | |
| ```bash | |
| ldd --version | head -1 | |
| # e.g. ldd (Ubuntu GLIBC 2.35-0ubuntu3) 2.35 | |
| ``` | |
| Check **target machine**: | |
| ```bash | |
| ldd --version | head -1 | |
| # must be >= build glibc (same major.minor or newer) | |
| ``` | |
| See which `GLIBC_` symbols the binary needs: | |
| ```bash | |
| objdump -T SessionExample | grep GLIBC_ | sed 's/.*GLIBC_/GLIBC_/' | sort -Vu | tail -5 | |
| objdump -T libiotdb_session.so | grep GLIBC_ | sed 's/.*GLIBC_/GLIBC_/' | sort -Vu | tail -5 | |
| ``` | |
| If the target glibc is too old, you'll get errors like | |
| `version 'GLIBC_2.34' not found` at runtime. Rebuild the SDK on an older distro | |
| (or in an older container) to widen compatibility. | |
| **Run** (with `.so` beside the binary): | |
| ```bash | |
| ./SessionExample | |
| ``` | |
| If the shared library is not found: | |
| ```bash | |
| export LD_LIBRARY_PATH=. | |
| ./SessionExample | |
| ``` | |
| No separate Thrift install is required. | |
| ### macOS | |
| Copy the example binary and `libiotdb_session.dylib` together. The target macOS | |
| version should be **≥ the deployment target used to build the SDK**. Check with: | |
| ```bash | |
| otool -L SessionExample | |
| ``` | |
| ## Development notes | |
| - **Windows**: Application and SDK both use **`/MD`** (dynamic CRT). This | |
| matches a default Visual Studio project; link `iotdb_session.lib`, ship | |
| `iotdb_session.dll`. | |
| - **Linux**: SDK is `libiotdb_session.so`; link it directly. Prefer shipping | |
| the `.so` next to your binary or setting `RPATH` to `$ORIGIN`. | |
| - Examples assume IoTDB is listening on `127.0.0.1:6667`; change host/port in | |
| the source if needed. | |
| ## Project layout in this module | |
| ``` | |
| client-cpp/examples/ | |
| ├── README.md | |
| ├── README_zh.md | |
| ├── CMakeLists.txt | |
| ├── SessionExample.cpp | |
| ├── AlignedTimeseriesSessionExample.cpp | |
| ├── TableModelSessionExample.cpp | |
| ├── MultiSvrNodeClient.cpp | |
| ├── tree_example.c | |
| └── table_example.c | |
| ``` | |
| After `mvn package`, the runnable tree is under `target/` (sources, `client/`, | |
| and CMake build output). |