资讯动态

Dora 预构建 C/C++ 库接入指南:静态库分发、CMake 集成与源码构建全解析

发布时间:2026/9/18 23:31:25 来源:尧图企业网站定制
Dora 预构建 C/C 库接入指南静态库分发、CMake 集成与源码构建全解析【免费下载链接】doraDORA (Dataflow-Oriented Robotic Architecture) is middleware designed to streamline and simplify the creation of AI-based robotic applications. It offers low latency, composable, and distributed dataflow capabilities. Applications are modeled as directed graphs, also referred to as pipelines.项目地址: https://gitcode.com/GitHub_Trending/do/dora本指南基于仓库 apis/C-CPP-LIBRARIES.md系统讲解 DORADataflow-Oriented Robotic Architecture为 C/C 开发者提供的预构建库分发体系包括四个可用的 API 库node/operator 的 C/C 版本、各目标平台的发布产物形态、find_package现代 CMake 集成方式、传统手工链接方式以及从源码自行构建并产出与发布产物一致布局的完整流程。读完本文你将能够为 Linux x86_64/ARM64、macOS Apple Silicon、Windows x86_64 任一目标平台选择正确的归档并接入自己的 C/C 数据流节点也能在需要时通过cargo buildxtask stage从源码构建出与 release 完全一致的库目录结构。Dora 的 C/C 预构建库是什么Dora 的核心运行时由 Rust 实现但数据流中的节点node与算子operator并不强制使用 Rust 编写。仓库在apis/目录下为 C 与 C 两种语言各提供了一对 API 封装 crate并在每次 Dora 版本发布时将编译产物作为 GitHub release 归档工件对外分发API 库crate语言用途dora-node-api-cC创建 Dora 节点node的 C APIdora-operator-api-cC创建 Dora 算子operator的 C APIdora-node-api-cxxC创建 Dora 节点的 C API基于cxx桥接dora-operator-api-cxxC创建 Dora 算子的 C API基于cxx桥接这四个 crate 均以staticlib形式产出静态库以 apis/c/node/Cargo.toml 为例[lib]段声明了crate-type [staticlib, lib]这正是 C 节点 API 能够产出libdora_node_api_c.a并直接被 GCC/Clang 链接的根源。C 一侧则依赖cxxcrate 生成桥接源码dora-node-api.h/dora-node-api.cc详见 apis/c/node/README.md。支持的发布目标平台预构建产物按 Cargo target triple 组织各平台对应的归档格式如下Target Triple平台归档格式x86_64-unknown-linux-gnuLinux x86_64glibc.tar.gzaarch64-unknown-linux-gnuLinux ARM64glibc.tar.gzaarch64-apple-darwinmacOS Apple Silicon.tar.gzx86_64-pc-windows-msvcWindows x86_64.zip需要特别注意Intel macOSx86_64-apple-darwin不在预构建发布范围内。如果必须在 x86_64 Mac 上使用只能从源码自行构建cargo build --release -p dora-node-api-c -p dora-operator-api-c -p dora-node-api-cxx -p dora-operator-api-cxx提示归档面向 glibc 平台发布若你的 Linux 发行版基于 musl如 Alpine预构建库并不适用同样需要走源码构建路线。下载与目录结构下载步骤打开 Dora 的 GitHub releases 页面按目标平台下载对应归档C APIdora-c-libraries-target.tar.gzWindows 为.zipC APIdora-cpp-libraries-target.tar.gzWindows 为.zip以 Linux x86_64 为例解压 C 库tar xzf dora-cpp-libraries-x86_64-unknown-linux-gnu.tar.gzC 库的目录布局dora-c-libraries-target/ ├── include/ │ ├── node_api.h │ ├── operator_api.h │ └── operator_types.h └── lib/ ├── libdora_node_api_c.a # Unix └── libdora_operator_api_c.a # Unix # Windows 上为 dora_node_api_c.lib 等其中 apis/c/node/node_api.h 提供了 C 节点的核心函数族init_dora_context_from_env从环境变量初始化上下文、dora_next_event取下一个事件、read_dora_event_type/read_dora_input_id/read_dora_input_data/read_dora_input_timestamp读取事件字段、dora_send_output发送输出、dora_log日志以及事件类型枚举DoraEventType_Stop / Input / InputClosed / Error / Unknown。apis/c/operator/operator_types.h 则定义了算子侧dora_init_operator、dora_drop_operator、dora_on_event、dora_send_operator_output以及DoraStatus_tDORA_STATUS_CONTINUE / STOP / STOP_ALL等 ABI 类型该头文件由safer_ffi自动生成请勿手工编辑。C 库的目录布局dora-cpp-libraries-target/ ├── include/ │ ├── dora-node-api.h │ └── dora-operator-api.h ├── src/ │ ├── dora-node-api.cc # 桥接源码需随你的代码一起编译 │ └── dora-operator-api.cc └── lib/ ├── libdora_node_api_cxx.a # Unix └── libdora_operator_api_cxx.a # Unix关键注意点C API 通过 cxx 实现 Rust↔C 互操作src/*.cc桥接文件不在静态库内必须随你的源码一起参与编译与链接CMake 中可通过${dora-node-api-cxx_CXX_BRIDGE_FILES}变量自动拿到这些文件。CMake 集成推荐使用 find_package预构建归档在lib/cmake/crate/下随附 CMake 配置文件对应模板见 apis/c/node/cmake/dora-api-config.cmake.in 与 apis/c/node/cmake/dora-api-config.cmake.in因此消费者可以用标准的find_package惯用法接入无需硬编码库路径或平台相关链接参数。归档提供的extra接口目标interface target已携带各平台的系统依赖Windows 的 winapi 库 / Apple frameworks / Linux 的 pthreaddlmrt消费者无需手动列出。C 节点示例cmake_minimum_required(VERSION 3.15) project(my_dora_node C) find_package(dora-node-api-c REQUIRED) add_executable(my_node main.c) target_link_libraries(my_node PRIVATE dora-node-api-c::dora-node-api-c dora-node-api-c::extra )C 节点示例cmake_minimum_required(VERSION 3.15) project(my_dora_node CXX) set(CMAKE_CXX_STANDARD 20) find_package(dora-node-api-cxx REQUIRED) add_executable(my_node main.cc ${dora-node-api-cxx_CXX_BRIDGE_FILES} ) target_link_libraries(my_node PRIVATE dora-node-api-cxx::dora-node-api-cxx dora-node-api-cxx::extra )注意 C 示例显式设置了CMAKE_CXX_STANDARD 20C 绑定的 metadata/时间戳等接口依赖 C20 能力如std::chrono::utc_clock。配置并构建通过CMAKE_PREFIX_PATH指向解压后的归档目录cmake -S . -B build -DCMAKE_PREFIX_PATH/path/to/dora-c-libraries-target cmake --build buildfind_package 的架构自检机制从 cmake config 模板 可以看到配置阶段会自动执行一次target-match 检查模板将构建时的TARGET如linux-x86_64写入DORA_BUILT_TARGET同时把当前主机归一化后的CMAKE_SYSTEM_NAMECMAKE_SYSTEM_PROCESSOR计算为DORA_CURRENT_TARGET二者不一致时直接FATAL_ERROR中止配置。这意味着解压了错误架构的归档会在 configure 阶段即被拦截而不是等到链接阶段才暴露符号错误。仓库的集成测试目录如 tests/cmake-find-package-c/CMakeLists.txt、tests/cmake-find-package-cxx/CMakeLists.txt正是对这一接入方式的可运行验证。传统方式手工指定 include 与库路径该模式仍可用于尚未迁移的老项目但新项目应优先使用上面的find_package。C 节点示例cmake_minimum_required(VERSION 3.15) project(my_dora_node C) # 按平台检测 target triple选择正确的库目录 if(CMAKE_SYSTEM_NAME STREQUAL Linux) if(CMAKE_SYSTEM_PROCESSOR MATCHES aarch64|arm64) set(DORA_TARGET aarch64-unknown-linux-gnu) else() set(DORA_TARGET x86_64-unknown-linux-gnu) endif() elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin) if(CMAKE_SYSTEM_PROCESSOR MATCHES aarch64|arm64) set(DORA_TARGET aarch64-apple-darwin) else() # Intel macOSx86_64-apple-darwin无预构建产物 # 发布工作流仅面向 Apple Silicon请在 x86_64 Mac 上源码构建。 message(FATAL_ERROR No pre-built dora C/C artifact for Intel macOS. Build from source or run on Apple Silicon.) endif() elseif(CMAKE_SYSTEM_NAME STREQUAL Windows) set(DORA_TARGET x86_64-pc-windows-msvc) endif() set(DORA_C_DIR ${CMAKE_SOURCE_DIR}/dora-c-libraries-${DORA_TARGET}) add_executable(my_node main.c) target_include_directories(my_node PRIVATE ${DORA_C_DIR}/include) if(WIN32) target_link_libraries(my_node ${DORA_C_DIR}/lib/dora_node_api_c.lib advapi32 userenv kernel32 ws2_32 bcrypt ncrypt schannel ntdll iphlpapi cfgmgr32 credui crypt32 cryptnet fwpuclnt gdi32 msimg32 mswsock ole32 oleaut32 opengl32 secur32 shell32 synchronization user32 winspool) elseif(APPLE) target_link_libraries(my_node ${DORA_C_DIR}/lib/libdora_node_api_c.a -framework CoreServices -framework Security pthread m c resolv) else() target_link_libraries(my_node ${DORA_C_DIR}/lib/libdora_node_api_c.a pthread dl m rt) endif()C 节点示例cmake_minimum_required(VERSION 3.15) project(my_dora_node CXX) set(CMAKE_CXX_STANDARD 20) # ... 平台检测逻辑同上 ... set(DORA_CPP_DIR ${CMAKE_SOURCE_DIR}/dora-cpp-libraries-${DORA_TARGET}) # 桥接源码必须随你的代码一起编译 add_executable(my_node main.cpp ${DORA_CPP_DIR}/src/dora-node-api.cc ) target_include_directories(my_node PRIVATE ${DORA_CPP_DIR}/include) if(WIN32) target_link_libraries(my_node ${DORA_CPP_DIR}/lib/dora_node_api_cxx.lib advapi32 userenv kernel32 ws2_32 bcrypt ncrypt schannel ntdll iphlpapi cfgmgr32 credui crypt32 cryptnet fwpuclnt gdi32 msimg32 mswsock ole32 oleaut32 opengl32 secur32 shell32 synchronization user32 winspool) elseif(APPLE) target_link_libraries(my_node ${DORA_CPP_DIR}/lib/libdora_node_api_cxx.a -framework CoreServices -framework Security pthread m c resolv) else() target_link_libraries(my_node ${DORA_CPP_DIR}/lib/libdora_node_api_cxx.a pthread dl m rt) endif()三组平台系统依赖在 cmake config 模板的extra接口目标中均有对应实现apis/c/node/cmake/dora-api-config.cmake.in 第 48-64 行手工写法与find_package写法在链接依赖上完全等价。手动链接GCC/Clang 命令行不经过 CMake 时可以直接用编译器命令完成链接。GCC/ClangLinux# C 节点 gcc -o my_node main.c \ -Idora-c-libraries-x86_64-unknown-linux-gnu/include \ -Ldora-c-libraries-x86_64-unknown-linux-gnu/lib \ -ldora_node_api_c -lpthread -ldl -lm -lrt # C 节点桥接源码必须一起编译 g -stdc20 -o my_node main.cpp dora-cpp-libraries-x86_64-unknown-linux-gnu/src/dora-node-api.cc \ -Idora-cpp-libraries-x86_64-unknown-linux-gnu/include \ -Ldora-cpp-libraries-x86_64-unknown-linux-gnu/lib \ -ldora_node_api_cxx -lpthread -ldl -lm -lrtClangmacOS# C 节点 clang -stdc20 -o my_node main.cpp dora-cpp-libraries-aarch64-apple-darwin/src/dora-node-api.cc \ -Idora-cpp-libraries-aarch64-apple-darwin/include \ -Ldora-cpp-libraries-aarch64-apple-darwin/lib \ -ldora_node_api_cxx \ -framework CoreServices -framework Security -lpthread -lm -lc -lresolvWindows 下手动链接同样需要dora_node_api_c.lib/dora_node_api_cxx.lib加前述一长串 winapi 系统库advapi32 userenv kernel32 ws2_32 bcrypt ncrypt schannel ntdll iphlpapi ...等这也是为什么强烈建议优先使用自带平台依赖的find_package。从源码构建预构建库若你的平台没有现成归档如 Intel macOS、musl 环境或希望自行定制可以完整从源码构建git clone https://github.com/dora-rs/dora.git cd dora cargo build --release \ -p dora-node-api-c \ -p dora-operator-api-c \ -p dora-node-api-cxx \ -p dora-operator-api-cxx # 静态库: target/release/ # C 头文件: apis/c/node/, apis/c/operator/ # C 桥接文件: target/cxxbridge/dora-{node,operator}-api-cxx/src/lib.rs.{h,cc}用 xtask stage 产出 find_package 可用的 prefix为了让源码构建的产物具备与 release 归档完全一致的布局含 cmake config、include、lib、桥接源码Dora 提供了xtask stage子命令实现见 xtask/src/main.rscargo run -p xtask -- stage dora-node-api-c target/release dora-c-libraries-local cargo run -p xtask -- stage dora-node-api-cxx target/release dora-cpp-libraries-local cmake -S my-project -B build -DCMAKE_PREFIX_PATH$(pwd)/dora-c-libraries-local从源码结构看xtask stage对 C 与 C-cxx后缀两类 crate 走不同分支C crate 额外负责收集cxxbridge生成的.h/.cc桥接文件并写入CXX_BRIDGE_FILES变量同时支持--target triple参数用于交叉编译场景下把 cmake 配置中的DORA_BUILT_TARGET重写为实际归档对应的 target避免 aarch64 消费者在 target-match 检查处被误拦。发布流程中的归档打包.github/workflows/publish-c-cpp-libraries.yml正是由同一个xtask stage驱动的因此本地构建产出的目录布局与 GitHub release 工件完全一致——你可以先在本地用xtask stage验证再切换到预构建归档。版本对齐要求务必使用与 Dora 运行时版本匹配的库版本。Dora 的数据流节点通过环境变量与 daemon 通信节点的 API 库与 daemon/CLI 属于同一发布版本是最稳妥的做法版本不一致可能导致事件协议、消息格式或启动参数的兼容问题。建议在下载归档时确认 release 版本号并让dora可执行文件与库来自同一版本。配套示例与测试仓库为本文所述的两条接入路线提供了可直接运行参考examples/c-dataflow/完整展示 C 数据流。其 node-c-api/main.cc 演示了基于 C API 的节点主循环——init_dora_context_from_env初始化、dora_next_event阻塞取事件、按DoraEventType_Input / Stop分支处理、dora_send_output发送输出、最后free_dora_event/free_dora_context释放dataflow.yml 定义了把 C/C 节点与运行时算子串成流水线的数据流声明。运行方式cargo run --example cxx-dataflow内部自动完成全部构建并启动数据流。examples/cmake-dataflow/展示 CMake 构建系统下的节点与算子接入既支持在工作区内构建也支持 out-of-tree 独立目录构建mkdir build cd build cmake .. make install随后dora up/dora start dataflow.yml/dora stop --all/dora down。tests/cmake-find-package-c/、tests/cmake-find-package-cxx/、tests/cmake-find-package-operator-c/、tests/cmake-find-package-operator-cxx/分别对 C/C 节点与算子的find_package接入做可执行验证。C 节点主循环参考源自 examples/c-dataflow/node-c-api/main.ccextern C { #include node_api.h } int run(void *dora_context) { unsigned char counter 0; while (true) { void *event dora_next_event(dora_context); if (event NULL) break; // 所有输入关闭数据流正常结束 enum DoraEventType ty read_dora_event_type(event); if (ty DoraEventType_Input) { counter 1; char *id_ptr; size_t id_len; read_dora_input_id(event, id_ptr, id_len); char *data_ptr; size_t data_len; read_dora_input_data(event, data_ptr, data_len); // ... 业务处理 ... int result dora_send_output(dora_context, counter, 7, (char *)counter, 1); if (result ! 0) return 1; } else if (ty DoraEventType_Stop) { printf([c node] received stop event\n); } free_dora_event(event); } return 0; }node_api.h头部注释还明确了线程安全契约源自 dora-rs/dora#540 审计同一dora_context同一时刻只能被一个线程访问dora_next_event/dora_send_output/dora_log并发调用属未定义行为事件指针创建后只读多个线程可以并发读同一事件的字段各自提供独立的out_ptr/out_len存储free_dora_context/free_dora_event转移所有权调用时须保证没有其他线程仍在访问。需要把事件扇出到多线程 worker 时建议单线程排空事件后按类型分发。总结接入 Dora 的 C/C 预构建库核心决策链只有三步确认目标平台是否有对应归档Intel macOS 除外→ 下载并解压正确的dora-c-libraries-*/dora-cpp-libraries-*→ 用find_package推荐或手工路径完成集成C 项目记得把src/*.cc桥接源码一并编译。需要定制或平台无归档时cargo build --release加xtask stage能在本地复刻出与 release 完全一致的目录布局便于先验证再交付。【免费下载链接】doraDORA (Dataflow-Oriented Robotic Architecture) is middleware designed to streamline and simplify the creation of AI-based robotic applications. It offers low latency, composable, and distributed dataflow capabilities. Applications are modeled as directed graphs, also referred to as pipelines.项目地址: https://gitcode.com/GitHub_Trending/do/dora创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价