blob: 435b58fe9e675214ccd249f60e6ec92ad2a7ca5d [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.
-->
# 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.21,**不再**通过
`-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/` 下找到构建产物。