生成文件

Cargo.toml

  1. [package]
  2. build = "build.rs"

build.rs

  1. use std::env;
  2. use std::fs::File;
  3. use std::io::Write;
  4. use std::path::Path;
  5. fn main() {
  6. let out_dir = env::var("OUT_DIR").unwrap();
  7. let dest_path = Path::new(&out_dir).join("hello.rs");
  8. let mut f = File::create(&dest_path).unwrap();
  9. f.write_all(
  10. b"
  11. fn say_hello() -> &'static str {
  12. \"hello\"
  13. }
  14. ",
  15. )
  16. .unwrap();
  17. }

执行文件:

  1. // 构建脚本
  2. // 指定的 build 命令,将在包编译之前,被编译和调用,从而具备 rust 代码所依赖
  3. // 构建一个捆绑的 C 库;
  4. // 在主机系统上找到 C 库;
  5. // 生成 Rust 模块;
  6. // 为 crate 执行所需某平台的特定配置;
  7. // [package]
  8. // cargo.toml 添加 build = "build.rs"
  9. include!(concat!(env!("OUT_DIR"), "/hello.rs"));
  10. fn main() {
  11. println!("{}", say_hello());
  12. }

编译 C 文件

  1. [package]
  2. build = "build.rs"
  3. [build-dependencies]
  4. cc = "1.0"

build.rs

  1. extern crate cc;
  2. fn main() {
  3. cc::Build::new().file("src/hello.c").compile("hello");
  4. }

执行文件:

  1. extern "C" {
  2. fn hello();
  3. }
  4. fn main() {
  5. // invoke the c function
  6. unsafe {
  7. hello();
  8. }
  9. }