Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用C从内置Rust的静态库调用函数?_C_Rust - Fatal编程技术网

是否可以使用C从内置Rust的静态库调用函数?

是否可以使用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中的一个函数,在C中被称为静态库

// 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当然,我更新了我的答案