当前位置: 首页 > news >正文

Rust/C/C++ 混合构建 - Cmake集成Cargo编译动态库

Cmake是一个强大的多语言编译工具,其内置模块提供了强大的扩展能力。

Rust官方的构建工具是Cargo,其提供了依赖下载,上传和编译等多项功能,极大的便利了Rust项目的开发。

目前C++多数用Cmake构建,如果是Rust集成cmake构建c++动态库,可以用Cargo构建脚本集成cmake-rs构建。

如果要调用Cargo构建Rust编译的动态库,并且通过cmake作为构建工具统一调度,目前主流方案是使用Cmake内置的add_custom_target模块调用Cargo构建。

Playground

1、cargo new rust-lib —lib 创建rust 项目,并在Cargo.toml中指定类型为cdylib

[package]
name = "rust_lib"
version = "0.1.0"
edition = "2021"[dependencies][lib]
crate-type = ["cdylib"]

2、在 src/lib.rs 创建greet_from_rust动态库函数

#[no_mangle]
pub extern "C" fn greet_from_rust() {println!("Hello, greeting!")
}

3、创建call_rust.c,内容如下

extern void greet_from_rust();int main(void) {greet_from_rust();return 0;
}

4、编写Cmake构建规则,创建CMakeLists.txt, 其内容如下

cmake_minimum_required(VERSION 3.22)
project(call_rust)set(ARGS --target-dir ${CMAKE_BINARY_DIR}/target)if (CMAKE_BUILD_TYPE STREQUAL "Release")message(STATUS "[RUST] Detected release build")set(build_profile "release")set(ARGS ${ARGS} --release)
else()message(STATUS "[RUST] Using default debug build")set(build_profile "debug")
endif()add_custom_target(cargo_build ALLCOMMAND ${CMAKE_COMMAND} -E env cargo build ${ARGS}DEPENDS src/lib.rs
)add_executable(call_rust call_rust.c)
add_library(rust_lib SHARED IMPORTED)
set_property(TARGET rust_lib PROPERTY IMPORTED_LOCATION "${CMAKE_BINARY_DIR}/target/${build_profile}/librust_lib.so")
target_link_libraries(call_rust PUBLIC rust_lib)总结

add_custom_target调用Cargo将src/lib.rs 编译成动态库,为了方便将Cargo的构建目录指定在当前项目下。

add_libraryset_property 将生成的动态库绑定到rust_lib 这个target上,最后将动态库rust_lib通过

target_link_libraries 链接到call_rust二进制target上

Cmake构建配置完成,我们可以通过

cmake -DCMAKE_BUILD_TYPE:STRING=Release . cmake -DCMAKE_BUILD_TYPE:STRING=Debug .

这两个命令切换构建选项,这也对应了Cargo构建的—release选项,然后通过

cmake —build . 构建当前项目, 输出

$ cmake  -DCMAKE_BUILD_TYPE:STRING=Release . && cmake --build . && ./call_rust
-- [RUST] Detected release build
-- Configuring done
-- Generating done
-- Build files have been written to: /root/workspace/build-tool-examples/rust_lib
Compiling rust_lib v0.1.0 (/root/workspace/build-tool-examples/rust_lib)
Finished release profile [optimized] target(s) in 0.44s
[  0%] Built target cargo_build
Consolidate compiler generated dependencies of target call_rust
[ 50%] Linking C executable call_rust
[100%] Built target call_rust
Hello, greeting!
http://www.zskr.cn/news/11794.html

相关文章:

  • 学习敏捷课程PSM,自考证书分享
  • 详细介绍:基于卷积神经网络的人车识别技术:从原理突破到场景重构的深度探索
  • Rust/C/C++ 混合构建 - 用Bazel构建Rust与C
  • sync.pool 面试题
  • 深入解析:SpringBoot与反射
  • 云栖小镇现场追踪!触摸AI 未来
  • 实用指南:【JavaEE】多线程案例(一)
  • Java学习日记9.18
  • AI Agent如何重塑人力资源管理?易路iBuilder平台实战案例深度解析
  • docker-compose + macvlan + Elasticsearch - 9.1.4 + Kibana - 9.1.4
  • WinForm 计时器 Timer 学习笔记
  • 深入了解一波JVM内存模型
  • CCPC2024-Zhengzhou G Same Sum(线段树)
  • CDN中使用边缘函数实现自定义编程
  • 敏捷开发的几个阶段
  • 实战:基于 BRPC+Etcd 打造轻量级 RPC 服务 —— 从注册到调用的完整实现 - 教程
  • 【2025最新】ArcGIS 点聚合功能实现全教程(进阶版) - 实践
  • 徐霞客的《青云志》
  • 运营商 API 安全最佳实践、案例与方案推荐(2025)|千万级接口的全链路实战
  • 使用trace进行排查网络瓶颈
  • JavaEE 导读与环境配置 - 实践
  • 实用指南:uniapp x鸿蒙开发之运行到鸿蒙模拟器
  • Redis 监听过期Key - 指南
  • 为什么我选择了 PSM 敏捷认证?
  • 编写msyql8.0.21 数据库批量备份脚本
  • ArcGIS 不重叠且无缝的拓扑检查和修改
  • 2025/9/25
  • 读书笔记:揭开索引的两个常见误区
  • 获取用户ip所在城市
  • 完整教程:JRE、JDK、JVM 及 JIT 之间有什么不同?