跳到主要内容

C++ 用法

面向最终用户的 C++ 接入用法:装好库后怎么打开模型、反复推理一张图、把会话收干净。

调用链​

C++ 与 C 共用同一份 C ABI 头 darra_ai.h。调用链两条写法,语义一致:

写法打开推理关闭
C ABI(同 C)darra_session_open / darra_session_open_plaindarra_session_infer_imagedarra_session_close
仓内薄封装Darra::AI::Session::open / Session::open_plainsession.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
ProviderORT / 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();