| <!-- | |
| 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++ 客户端示例 | |
| [English](README.md) | |
| 本目录提供链接 **IoTDB C++ Session SDK**(`iotdb_session`)的示例程序。 | |
| 应用侧编译 **不需要** 单独安装 Thrift 或 Boost 头文件/库,它们已封装在 SDK | |
| 共享库内部。 | |
| 所有示例默认连接本机 IoTDB(`127.0.0.1:6667`,用户 `root` / 密码 `root`)。 | |
| | 示例 | 说明 | | |
| |------|------| | |
| | `SessionExample` | 树模型:建库建序列、写入、查询、删除 | | |
| | `AlignedTimeseriesSessionExample` | 对齐时间序列与模板 | | |
| | `TableModelSessionExample` | 表模型(关系型) | | |
| | `MultiSvrNodeClient` | 多节点写入/查询循环 | | |
| | `tree_example` | C Session API(树模型) | | |
| | `table_example` | C Session API(表模型) | | |
| ## 选择哪个 SDK 压缩包 | |
| CI 发版([client-cpp-package.yml](../../.github/workflows/client-cpp-package.yml)) | |
| 会按平台/工具链打出多份 zip,文件名形如 | |
| `iotdb-session-cpp-<version>-<classifier>.zip`(解压后根目录即为 `include/` 与 `lib/`)。请按目标环境选择: | |
| | 目标环境 | classifier 后缀 | | |
| |----------|-----------------| | |
| | 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 + 与工程相同的 VS 版本 | `windows-x86_64-msvc14.1` ... `msvc14.4` | | |
| 当前 CMake 构建在配置阶段从源码编译 Thrift 0.24,**不再**通过 | |
| `-Diotdb-tools-thrift.version=0.14.1.1-gcc4-SNAPSHOT` 等旧参数控制 glibc; | |
| Linux 发版包在 `manylinux_2_28` 容器中构建,部署机需要 glibc 2.28 或更新版本。 | |
| 详见 [client-cpp README](../../iotdb-client/client-cpp/README.md)。 | |
| ## SDK 目录结构(解压后) | |
| `client-cpp` 打出的 SDK 压缩包只包含 **公开头文件** 和 **一个共享库**: | |
| ``` | |
| client/ | |
| ├── include/ | |
| │ ├── Session.h | |
| │ ├── Export.h | |
| │ └── ... (17 个公开头;无 thrift/、boost/) | |
| └── lib/ | |
| ├── iotdb_session.dll + iotdb_session.lib (Windows) | |
| ├── libiotdb_session.so (Linux) | |
| └── libiotdb_session.dylib (macOS) | |
| ``` | |
| ## 编译示例 | |
| ### 方式 A:Maven(本仓库推荐) | |
| 在仓库根目录执行: | |
| ```bash | |
| mvn clean verify -P with-cpp -pl iotdb-client/client-cpp -am | |
| ``` | |
| Maven 会构建 C++ client,在 verify 阶段启动本地 IoTDB,并通过 CTest 运行 C++ | |
| 测试和可自动运行的 examples。示例二进制在 | |
| `iotdb-client/client-cpp/target/build/examples/` 下(Windows + Visual Studio | |
| 通常在 `target/build/examples/Release/`)。 | |
| ### 方式 B:仅 CMake(手动准备 SDK) | |
| 1. 自行编译或下载 SDK,解压后保证存在 `client/include` 与 `client/lib`(见 | |
| 上文目录结构)。 | |
| 2. 使用这个 `examples/` 目录作为源码目录,并把 `client/` 放在旁边;也可以传入 | |
| `-DIOTDB_SDK_ROOT=/path/to/iotdb-session-cpp-...`。 | |
| 3. 配置并编译: | |
| ```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 生成器): | |
| ```powershell | |
| cmake -S . -B build -A x64 | |
| cmake --build build --config Release | |
| ``` | |
| 编译完成后,IoTDB 运行时库会通过 POST_BUILD 自动复制到 **与可执行文件相同 | |
| 的目录**。Linux/macOS 可执行文件还设置了 `$ORIGIN` rpath,可在同目录加载 | |
| `.so` / `.dylib`。 | |
| 可选:打部署包目录 | |
| ```bash | |
| cmake --build build --target example-dist | |
| # 生成 build/dist/,内含全部示例二进制 + libiotdb_session.{so,dll,dylib} | |
| ``` | |
| ## 在「干净机器」上运行(无需编译器、无需 SDK 头文件) | |
| 目标机器只需: | |
| 1. 可访问的 **IoTDB 服务**(已启动)。 | |
| 2. **示例可执行文件** 与 **IoTDB 运行时库** 放在 **同一目录**(或位于系统 | |
| 库搜索路径中)。 | |
| 可从 `build/.../Release/`(Windows)或 `build/`(Ninja/Make)复制,也可在 | |
| 执行 `example-dist` 后直接使用 `build/dist/`。 | |
| ### Windows | |
| **需要拷贝的文件** | |
| ``` | |
| SessionExample.exe | |
| iotdb_session.dll | |
| ``` | |
| (其他示例同理,可执行文件与 `iotdb_session.dll` 成对拷贝。) | |
| **目标机器前置条件** | |
| - **64 位 Windows**(示例为 x64 构建)。 | |
| - 安装 **[Microsoft Visual C++ 2015–2022 可再发行组件包(x64)](https://learn.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redist)**。 | |
| SDK 与示例均使用 **`/MD`**(动态 CRT),该安装包提供 `vcruntime140.dll`、 | |
| `msvcp140.dll` 等运行时。 | |
| **仅安装此 Redistributable 即可**,目标机 **不需要** Visual Studio,也 | |
| **不需要** IoTDB SDK 头文件或 Thrift/Boost。 | |
| **运行** | |
| ```powershell | |
| .\SessionExample.exe | |
| ``` | |
| 若提示缺少 `VCRUNTIME140.dll`,请安装上述 VC++ 可再发行包。 | |
| Thrift、Boost 已包含在 `iotdb_session.dll` 内,无需单独部署。 | |
| ### Linux | |
| **需要拷贝的文件** | |
| ``` | |
| SessionExample | |
| libiotdb_session.so | |
| chmod +x SessionExample | |
| ``` | |
| **目标机器前置条件** | |
| - 目标机的 **glibc 版本必须 ≥ 编译 SDK 时的 glibc 版本**(仅向后兼容: | |
| 新系统可跑旧库要求,旧系统不能跑需要更高 glibc 的二进制)。 | |
| 在 **编译机** 上记录版本(建议写入发布说明): | |
| ```bash | |
| ldd --version | head -1 | |
| # 例如:ldd (Ubuntu GLIBC 2.35-0ubuntu3) 2.35 | |
| ``` | |
| 在 **目标机** 上检查: | |
| ```bash | |
| ldd --version | head -1 | |
| # 版本号应 >= 编译机(同主版本次版本或更新) | |
| ``` | |
| 查看二进制依赖的最高 `GLIBC_` 符号: | |
| ```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 | |
| ``` | |
| 若目标 glibc 过旧,运行时会报错,例如 | |
| `version 'GLIBC_2.34' not found`。可在更旧的发行版(或旧版容器)上重新编译 | |
| SDK,以扩大兼容范围。 | |
| **运行**(`.so` 与可执行文件同目录): | |
| ```bash | |
| ./SessionExample | |
| ``` | |
| 若找不到共享库: | |
| ```bash | |
| export LD_LIBRARY_PATH=. | |
| ./SessionExample | |
| ``` | |
| 无需单独安装 Thrift。 | |
| ### macOS | |
| 将示例可执行文件与 `libiotdb_session.dylib` 放在同一目录。目标 macOS 版本 | |
| 应 **≥ 编译 SDK 时设置的 deployment target**。可用以下命令检查依赖: | |
| ```bash | |
| otool -L SessionExample | |
| ``` | |
| ## 开发说明 | |
| - **Windows**:应用与 SDK 均使用 **`/MD`**,与 Visual Studio 默认工程一致; | |
| 链接 `iotdb_session.lib`,部署时携带 `iotdb_session.dll`。 | |
| - **Linux**:直接链接 `libiotdb_session.so`;建议与可执行文件同目录发布,或 | |
| 设置 `RPATH=$ORIGIN`。 | |
| - 示例默认连接 `127.0.0.1:6667`;如需修改地址/端口,请编辑对应源码。 | |
| ## 本模块目录结构 | |
| ``` | |
| client-cpp/examples/ | |
| ├── README.md # 英文说明 | |
| ├── README_zh.md # 中文说明(本文件) | |
| ├── CMakeLists.txt | |
| ├── SessionExample.cpp | |
| ├── AlignedTimeseriesSessionExample.cpp | |
| ├── TableModelSessionExample.cpp | |
| ├── MultiSvrNodeClient.cpp | |
| ├── tree_example.c | |
| └── table_example.c | |
| ``` | |
| 执行 `mvn verify -P with-cpp -pl iotdb-client/client-cpp -am` 后,可在 | |
| `iotdb-client/client-cpp/target/build/examples/` 下找到构建产物。 |