是否可以使用C从内置Rust的静态库调用函数?
Rust中的一个函数,在C中被称为静态库是否可以使用C从内置Rust的静态库调用函数?,c,rust,C,Rust,Rust中的一个函数,在C中被称为静态库 // Rust fn message() -> String // C int main() { message() } 建立一个项目 像往常一样创建一个新的cargo库: $cargo新建我的锈蚀库--lib 然后,您可以配置cargo以发射系统库,而不是其常规目标: [lib] crate-type = ["cdylib"] # dynamic lib # crate-type = ["s
// Rust
fn message() -> String
// C
int main() {
message()
}
建立一个项目
像往常一样创建一个新的cargo
库:
$cargo新建我的锈蚀库--lib
然后,您可以配置cargo
以发射系统库,而不是其常规目标:
[lib]
crate-type = ["cdylib"] # dynamic lib
# crate-type = ["staticlib"] # static lib
构建一个C API
您可以将函数标记为extern“C”
,以告知编译器使用C ABI。您还需要添加#[no_mangle]
注释,以告知编译器不要损坏此函数的名称:
#[无损坏]
发布外部“C”fn消息(){
println!(“你好,C!”)
}
连接
您可以像往常一样建造板条箱:
$cargo build——发布
cargo
将在target/release
目录中创建一个my_lib.so
或my_lib.a
文件。此库可以通过构建系统简单地链接。但是,从C调用Rust函数需要一个头文件来声明函数签名
每个extern fn
都需要有相应的头函数
#[无损坏]
发布外部“C”fn消息(){}
将成为:
void消息(void);
您可以使用一个板条箱自动化此过程,该板条箱分析您的锈迹代码并生成相应的C/C++头。您可以将其与货物一起安装
:
$cargo安装cbindgen
创建一个空的配置文件:
$touch cbindgen.toml
并生成头文件:
$cbindgen--config cbindgen.toml--carte my_rust_库--output my_header.h--lang c
现在,您可以简单地包含标题并从C中调用Rust函数
#包括“my_header.h”
消息()
设置项目
像往常一样创建一个新的cargo
库:
$cargo新建我的锈蚀库--lib
然后,您可以配置cargo
以发射系统库,而不是其常规目标:
[lib]
crate-type = ["cdylib"] # dynamic lib
# crate-type = ["staticlib"] # static lib
构建一个C API
您可以将函数标记为extern“C”
,以告知编译器使用C ABI。您还需要添加#[no_mangle]
注释,以告知编译器不要损坏此函数的名称:
#[无损坏]
发布外部“C”fn消息(){
println!(“你好,C!”)
}
连接
您可以像往常一样建造板条箱:
$cargo build——发布
cargo
将在target/release
目录中创建一个my_lib.so
或my_lib.a
文件。此库可以通过构建系统简单地链接。但是,从C调用Rust函数需要一个头文件来声明函数签名
每个extern fn
都需要有相应的头函数
#[无损坏]
发布外部“C”fn消息(){}
将成为:
void消息(void);
您可以使用一个板条箱自动化此过程,该板条箱分析您的锈迹代码并生成相应的C/C++头。您可以将其与货物一起安装
:
$cargo安装cbindgen
创建一个空的配置文件:
$touch cbindgen.toml
并生成头文件:
$cbindgen--config cbindgen.toml--carte my_rust_库--output my_header.h--lang c
现在,您可以简单地包含标题并从C中调用Rust函数
#包括“my_header.h”
消息()
能否在回答中添加用于构建共享库的命令行代码?Thanks@yoell32当然,我更新了我的答案你能在你的答案中添加用于构建rust共享库的命令行代码吗?Thanks@yoell32当然,我更新了我的答案