当前位置: 首页 > 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_library和set_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.dtcms.com/a/408184.html

相关文章:

  • 松岗网站开发头条热点新闻
  • 如何建设wap网站泉州网站制作多少钱
  • 从转动惯量到惯量张量:深入理解刚体旋转的惯性本质
  • AG-UI协议详解:让智能体与前端无缝对话的事件通信标准
  • 宁波江北区城市建设档案馆网站企业门户网站需求文档
  • 太仓做企业网站网站搭建策略与方法
  • GraphRAG:知识图谱赋能的检索增强生成
  • 幽冥大陆(八)网页wasm汇编语言的作用—东方仙盟化神期
  • centos7.9和rocky8.6 部署MongoDB4.4.18分片集群对比
  • 相亲网站如何做自我介绍营销运营推广服务
  • 商会网站设计企业网站seo优帮云
  • 做网站需要那些技术怎么把自己做的网站放到百度上
  • Android16 应用代码新特性
  • 哪个网站做h5好小程序注册的账号怎么注销
  • 网站怎样做快照是做网站编辑还是做平面设计
  • 做好网站建设和运营秦皇岛建筑
  • 网站建设维护招聘一个新手如何做网站
  • 深圳网站建设做微信的网站叫什么软件
  • 惠州网站建设教程wordpress企业网站插件
  • 快应用报错Module Error 分包要求 app.json#minPlatformVersion 不小于 1061, 当前值为 21解决方案-优雅草卓伊凡
  • 做网站空间备案的职业wordpress 投稿 加标签
  • 网站建设外包工作怎么知道网站的ftp
  • 网站查询域名解析ip接单网站开发
  • 美发企业网站建设价格有网站和无网站的区别
  • 外贸关键词网站南昌开发公司
  • 电商网站设计文档网络工程师高级职称
  • 备案网站名怎么填写丽水微信网站建设报价
  • 32位汇编:实验4传送类指令的使用
  • MP4和WMV2压缩机制对比
  • 网站 图片延时加载农家院网站素材