C++ 用法
面向最终用户的 C++ 接入用法:装好库后怎么打开模型、反复推理一张图、把会话收干净。
调用链
C++ 与 C 共用同一份 C ABI 头 darra_ai.h。调用链两条写法,语义一致:
| 写法 | 打开 | 推理 | 关闭 |
|---|---|---|---|
| C ABI(同 C) | darra_session_open / darra_session_open_plain | darra_session_infer_image | darra_session_close |
| 仓内薄封装 | Darra::AI::Session::open / Session::open_plain | session.infer_image | 析构自动 close |
仓内薄封装在 include/darra_ai.hpp,命名空间 Darra::AI,把上面三个 C 函数收成 RAII 会话:打开成本只付一次,之后对同一会话反复 infer_image,不要每张图重新打开;会话析构时自动 darra_session_close。
加载后核对 ABI 统一走 Darra::AI::ensure_abi()(open 内部也会核)。薄封装失败抛 Darra::AI::Error(派生自 std::runtime_error,code() 取错误码),按异常写,不按 C 的 int 返回值写。
前置依赖
| 项目 | 要求 |
|---|---|
| 语言标准 | C++17(结果解析头用 std::optional / std::variant) |
| 编译器 | MSVC 加 /utf-8 /EHsc,或 GCC / Clang |
| 链接库 | Core.lib(Windows)/ libdarraai_core.so(Linux) |
| 运行时 | Core.dll 放在 exe 旁或 PATH |
| Provider | ORT / CUDA / TensorRT / OpenVINO 等提前部署为 Provider;SDK 不下载不安装 |
| 平台 | Windows x64 / Linux x86_64 / Linux ARM64;macOS 不在 v1 |
安装
从 下载 的 darra-ai-c-sdk.zip 或平台内核包取头文件 + 库(C 与 C++ 不是两套包,文件清单见 C++ 安装一节)。
仓内直接编(MSVC,x64):
cl /nologo /utf-8 /EHsc /std:c++17 /I ..\include /I ..\..\Core\include infer.cpp /Fe:infer.exe /link Core.lib
GCC / Linux 一行:
c++ -std=c++17 -I C++/include -I Core/include infer.cpp -ldarraai_core -o infer
仓内相对 include 已写死到 ../../Core/include/darra_ai.h。安装布局把 darra_ai.h 放进同一 include 搜索路径时,定义 DARRA_AI_USE_SYSTEM_C_HEADER 再 include 本头。
快速开始
最小程序:核 ABI → 打开加密容器 → 读图 → 推理一张 → 析构关闭。
#include "darra_ai.hpp"
#include "darra_ai_sugar.hpp"
#include <cstdio>
#include <vector>
int main() {
try {
Darra::AI::ensure_abi();
Darra::AI::Session s = Darra::AI::Session::open("model.darmodel");
std::vector<uint8_t> jpg = Darra::AI::read_file_bytes("photo.jpg");
std::string json =
s.infer_image(jpg.data(), jpg.size(), Darra::AI::ImageDesc::Auto());
std::printf("%s\n", json.c_str());
return 0; // s 析构 → darra_session_close
} catch (const Darra::AI::Error& e) {
std::fprintf(stderr, "%s\n", e.what());
return static_cast<int>(e.code());
}
}
明文 ONNX 把打开行换成一行 Session::open_plain("model.onnx")。读文件 + 推理 + 解析一步到位用语法糖一行 Darra::AI::infer_file(s, "photo.jpg")。
按场景索引
| 场景 | 说明 |
|---|---|
| 推理入门 | 打开会话、推理一张图、关闭的最小调用链 |
| 视频连续推理 | 相机逐帧进图,满队列丢最旧帧保最新画面 |
| 图片队列 | 一次上百张进队列,容量与溢出策略由应用定 |
| 并行推理 | 同模型多路并发,推理线程数独立可配 |
| 多模型并行 | 多模型或多卡分槽,按 Weight 分并发槽份额 |
| 错误码 | 失败码与修复建议 |
设备池
多张卡按每卡权重分活,不是插队。和同一张卡上的推理池不是一回事。 打开没成功:抛 Darra::AI::Error。路径空、文件不在、未激活、缺 Provider、ABI 不符都会失败;运行库缺符号在链接期失败。不是关了再开。
Darra::AI::DevicePool pool = Darra::AI::DevicePool::open_plain("model.onnx");
uint64_t ticket = pool.submit(jpg.data(), jpg.size(), Darra::AI::ImageDesc::Auto(), -1);
std::string json = pool.wait(ticket);
pool.close();