// 在 Cargo.toml 中,加入如下两行
[lib]
crate-type = ["cdylib"]
// src/lib.rs
#[no_mangle]
pub extern "C" fn addtwo0(a: u32, b: u32) {
let c = a + b;
println!("print in rust, sum is: {}", c);
}
cargo build 编译。会在 target/debug/ 下生成 lib{cratename}.so (我们这里为 librustffi3.so)这个动态链接库文件。#include <stdio.h>
#include <stdint.h>
extern void addtwo0(uint32_t, uint32_t);
int main(void) {
addtwo0(1, 2);
}
gcc -o ./ccode01 ./csrc/ccode01.c -L ./ -lrustffi3
ccode01 二进制文件(我已把 librustffi3.so 文件拷贝至当前目录)。运行LD_LIBRARY_PATH=. ./ccode01
print in rust, sum is: 3
// src/lib.rs
#[no_mangle]
pub extern "C" fn addtwo1(a: u32, b: u32) -> u32 {
let c = a + b;
println!("print in rust, sum is: {}", c);
c
}
#include <stdio.h>
#include <stdint.h>
extern uint32_t addtwo1(uint32_t, uint32_t);
int main(void) {
uint32_t sum = addtwo1(10, 20);
printf("print in c, sum is: %d\n", sum);
}
print in rust, sum is: 30
print in c, sum is: 30
// csrc/ccode03.c
#include <stdio.h>
#include <stdint.h>
extern uint32_t sum_of_array(const uint32_t *numbers, size_t length);
int main(void) {
uint32_t numbers[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
unsigned int length = sizeof(numbers) / sizeof(*numbers);
uint32_t sum = sum_of_array(numbers, length);
printf("print in c, sum is: %d\n", sum);
}
// src/lib.rs
use std::slice;
#[no_mangle]
pub extern "C" fn sum_of_array(array: *const u32, len: usize) -> u32 {
let array = unsafe {
assert!(!array.is_null());
slice::from_raw_parts(array, len)
};
array.iter().sum()
}
编译 rust so:cargo build
编译 c binary:gcc -o ./ccode03 ./ccode03.c -L ./ -lrustffi3
运行:LD_LIBRARY_PATH=. ./ccode03
print in c, sum is: 55
*const u32 就对应 C 中的 const uint32_t *。assert!(!array.is_null());
let array = unsafe {
slice::from_raw_parts(array, len)
};
from_raw_parts() 操作是 unsafe 的,因此需要包在 unsafe {} 中执行。原文作者:Rust语言中文社区;如有侵权,请联系管理员删除。