Using .c source files with Rust

蹲街弑〆低调 提交于 2019-12-17 20:08:53

问题


Is there a standard way to include .c source files?

So far I've been using extern "C" { ... } to expose the functions, compiling .c to an object file, running rustc until ld chokes with an undefined reference, and using the arguments shown after error: linking with 'cc' failed with code 1; note: cc arguments: ... to run cc myobjfile.o ...


回答1:


Editor's note: This answer predates Rust 1.0 and is no longer applicable.

Luqman gave a hint on IRC; using extern "C" { ... } with #[link_args="src/source.c"]; in the crate file works for me.




回答2:


Use the cc crate in a build script to compile the C files into a static library and then link the static library to your Rust program:

Cargo.toml

[package]
name = "calling-c"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]
edition = "2018"

[build-dependencies]
cc = "1.0.28"

build.rs

use cc;

fn main() {
    cc::Build::new()
        .file("src/example.c")
        .compile("foo");
}

src/example.c

#include <stdint.h>

uint8_t testing(uint8_t i) {
  return i * 2;
}

src/main.rs

extern "C" {
    fn testing(x: u8) -> u8;
}

fn main() {
    let a = unsafe { testing(21) };
    println!("a = {}", a);
}


来源:https://stackoverflow.com/questions/15488425/using-c-source-files-with-rust

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!