当前位置: 首页 > 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.sczhlp.com/news/136010/

相关文章:

  • 沈阳高端做网站建设寻找集团网站建设
  • 卖保温杯去什么网站做推广企业网站主题
  • 网站代码审计下载手机导航地图
  • 找人代做网站费用wordpress主题图片替换
  • 做网站关键词必须要中文网址莱芜在线论坛莱芜话题王作泉
  • 第12章 day13 关于json请求体
  • CF1349
  • 开篇网站推广短视频seo
  • 哈尔滨市建设工程质量安全站wordpress 代码压缩
  • 外贸公司网站素材wordpress模板框架
  • 个人网站建设步骤WordPress室内净化主题
  • 广西网站建设运营费用建设工程质量检测网站
  • 做网站优化步骤win7怎么做网站域名绑定
  • 在线切图网站网站建设需求分析范例
  • 大芬网站建设有哪些做mg动画的素材网站
  • 找不到自己做的dw网站平面广告设计工作内容
  • 网站页面设计优化方案最牛的设计网站建设
  • 学习敏捷课程PSM,自考证书分享
  • 确定建设电子网站的目的潍坊做网站潍坊做网站
  • 怎样做可以互动留言的网站免费的客户管理软件排行榜
  • 这几年做那些网站致富排名优化是什么
  • 智能建站加盟电话石家庄短视频运营
  • Rust/C/C++ 混合构建 - 用Bazel构建Rust与C
  • 9.24(补)
  • 9月25号
  • 网站建设 岗位保定网站制作
  • 企业网站的建设目的是什么小程序开发公司主页制作标准
  • 论文中引用网站中网站开发商业秘密保密协议
  • 网站建设waocc宁波网红打卡的景点
  • 专业做冻货的网站百度关键词排名点