12

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 ...

2 Answers 2

7

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.

Sign up to request clarification or add additional context in comments.

2 Comments

That's clever. I've never seen anyone do that before, and would not necessarily expect this to continue working forever. This works because Rust uses a C compiler (currently always either gcc or clang) to drive the final link step.
(I would expect it to stop working in the relatively near future, at this point)
6

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 <[email protected]>"]
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);
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.