<!--

    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

[English](README.md)

本目录用于构建和打包 Apache IoTDB C++ Session SDK。如果你已经拿到了
`iotdb-session-cpp-<version>-<classifier>.zip`，在自己的 C/C++ 项目中使用
时不需要 Maven、Thrift、Boost，也不需要本源码目录。解压 zip 后，让项目引用
其中的 `include/` 和 `lib/`，并在运行时把 IoTDB 动态库随可执行文件一起部署
即可。

## 在项目中使用已打好的 SDK 包

### 1. 选择并解压正确的包

请按应用运行环境选择对应 classifier：

| 目标环境 | Zip 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 + 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` |

示例：

```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
```

解压后的 SDK 主要包含：

```
include/                         C/C++ 公开 API 头文件
lib/                             libiotdb_session.so/.dylib 或 iotdb_session.dll + .lib
cmake/iotdb-session-config.cmake CMake package config
pkgconfig/iotdb-session.pc       pkg-config 元数据
examples/                        示例源码和示例 CMakeLists.txt
third_party/DEPENDENCIES.md      内置第三方依赖说明
```

Thrift 和 Boost 已封装进 `iotdb_session`，普通应用接入时不需要额外安装
Thrift 或 Boost 的头文件/库。

### 2. 用 CMake 链接

项目中的 `CMakeLists.txt` 可这样写：

```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)
```

配置时传入 SDK 解压目录：

```bash
cmake -S . -B build -DCMAKE_PREFIX_PATH="$IOTDB_SESSION_HOME"
cmake --build build
```

Windows 上请使用与 SDK 包一致的 Visual Studio 代际。例如
`windows-x86_64-msvc14.3` 对应 Visual Studio 2022。

Visual Studio 用户可以直接打开项目目录，并在 CMake 缓存设置里把 SDK 解压目录
加入 `CMAKE_PREFIX_PATH`；也可以在 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. 在 Linux/macOS 上用 pkg-config 链接

```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
```

运行时如果系统找不到动态库，可以把动态库复制到可执行文件同目录，或设置库搜索
路径：

```bash
cp -P "$IOTDB_SESSION_HOME"/lib/libiotdb_session.so* .
./my_iotdb_app

# 或者：
LD_LIBRARY_PATH="$IOTDB_SESSION_HOME/lib:$LD_LIBRARY_PATH" ./my_iotdb_app
```

### 4. 手动指定头文件和库路径

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 + 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. 编译包内 examples

SDK 包内 `examples/` 目录包含示例源码。进入 SDK 解压根目录后执行：

```bash
cmake -S examples -B examples-build -DCMAKE_BUILD_TYPE=Release
cmake --build examples-build
```

Windows：

```bat
cmake -S examples -B examples-build -G "Visual Studio 17 2022" -A x64
cmake --build examples-build --config Release
```

examples 构建会把 IoTDB 运行时库复制到每个示例可执行文件旁边。也可以执行
`cmake --build examples-build --target example-dist` 生成包含示例和运行时库的
`dist/` 目录。

### 6. 最小 C++ 示例

```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;
}
```

包内 `examples/` 下的示例默认连接 `127.0.0.1:6667`，用户名和密码均为
`root`。运行示例前请先启动 IoTDB 服务。

### 运行时部署注意事项

- Linux 发版包在 `manylinux_2_28` 容器中使用 GCC 14 构建，目标机器需要 glibc 2.28 或更新
  版本。
- Windows 包使用 MSVC 动态运行时（`/MD`）。目标机器如果没有对应运行时，请安装
  与 Visual Studio 代际匹配的 Microsoft Visual C++ Redistributable。
- 将 `libiotdb_session.so`、`libiotdb_session.dylib` 或 `iotdb_session.dll`
  放在可执行文件同目录，或配置平台对应的动态库搜索路径。Linux 手动复制时请保留
  `libiotdb_session.so*` 的符号链接链。

## 从源码构建 SDK

C++ client 使用本目录下单一的 `CMakeLists.txt` 构建。外层 Maven POM 只是调用
CMake 的包装；没有 Maven 时也可以直接使用 CMake。

### 常用构建命令

| 目标 | 命令 |
|------|------|
| 只构建库（Linux/macOS） | `mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests package` |
| 构建 Debug 库（Linux/macOS） | `mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests -Dcmake.build.type=Debug package` |
| 只构建库（Windows / MSVC） | `mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests "-Dboost.include.dir=C:\boost_1_88_0" package` |
| 构建 Debug 库（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` |
| 直接使用 CMake | `cmake -S iotdb-client/client-cpp -B build && cmake --build build --target install` |

Maven 构建会把 SDK 安装到 `target/install/`，并生成
`target/iotdb-session-cpp-<version>-<classifier>.zip` 及对应 `.sha512`。
可通过 `-Dclient.cpp.package.classifier=...` 指定 classifier。

### CMake 选项

通过 Maven 构建时，常用 CMake 选项对应的 Maven 属性如下：

| CMake 变量 | Maven 属性 |
|------------|------------|
| `WITH_SSL` | `with.ssl`，例如 `-Dwith.ssl=ON` |
| `IOTDB_OFFLINE` | `iotdb.offline` |
| `BUILD_TESTING` | `build.tests` |
| `IOTDB_DEPS_DIR` | `iotdb.deps.dir` |
| `BOOST_INCLUDEDIR` | `boost.include.dir` |
| `CMAKE_BUILD_TYPE` | `cmake.build.type`，例如 `-Dcmake.build.type=Debug` |

直接使用 CMake 时传入 `-DWITH_SSL=ON`、`-DIOTDB_OFFLINE=ON` 等即可。
Debug 构建请在配置阶段传入 `-DCMAKE_BUILD_TYPE=Debug`。Windows 使用 Visual
Studio 生成器时也需要传入该选项，以便内置 Thrift 静态库使用 Debug MSVC 运行时；
随后用 `cmake --build build --config Debug --target install` 构建安装。

```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
```

### 离线构建

离线构建需要先把依赖源码包放入 `third-party/<platform>/`，然后执行：

```bash
mvn -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests \
  -Diotdb.offline=ON package
```

或直接使用 CMake：

```bash
cmake -S iotdb-client/client-cpp -B build -DIOTDB_OFFLINE=ON
cmake --build build --config Release --target install
```

完整依赖清单、SSL、测试和格式化说明请参考英文版 [README.md](README.md)。
