如何通过C-FFI从Rust调用Nim函数?

侯赛因·阿德南(Hossain Adnan)

Nim后端集成指南介绍了如何从C调用Nim函数。

示例功能:

proc fib(a: cint): cint {.exportc.} =
  if a <= 2:
    result = 1
  else:
    result = fib(a - 1) + fib(a - 2)

该过程要求指示Nim编译器不要创建main函数,避免从以下位置链接和创建头文件到FFI:

$ nim c --noMain --noLinking --header:fib.h fib.nim

为了能够使用该函数,C主程序必须调用一个NimMain()如下所示的函数

#include "fib.h"
#include <stdio.h>

int main(void)
{
  NimMain();
  for (int f = 0; f < 10; f++)
    printf("Fib of %d is %d\n", f, fib(f));
  return 0;
}

前面提到的生成的头文件放置在nimcache目录中。必须指示C编译器编译生成的nimcache子目录下的所有文件nimbase.h并且main.c

$ gcc -o m -I$HOME/.cache/nim/fib_d -Ipath/to/nim/lib $HOME/.cache/nim/fib_d/*.c maths.c

我如何指示rust编译器在下面寻找那些翻译单元nimcache

爱德华

在Rust项目中,可以具有构建脚本来编译和链接第三方非Rust代码。cccrate结合使用,可以更轻松地调用C / C ++编译器,这很有趣。

项目布局:

├── build.rs
├── Cargo.toml
└── src
    ├── fib.nim
    └── main.rs

build.rs本身:

use std::io::{self, Write};
use std::process::Command;

fn main() {
    let output = Command::new("nim")
        .arg("c")
        .arg("--noMain")
        .arg("--noLinking")
        .arg("--nimcache:nimcache")
        .arg("src/fib.nim")
        .output()
        .expect("Failed to invoke nim compiler");
    if !output.status.success() {
        let msg = String::from_utf8_lossy(output.stderr.as_slice());
        let _ = writeln!(io::stderr(), "\nerror occurred: {}\n", msg);
        std::process::exit(1);
    }

    cc::Build::new()
        .include("/usr/lib/nim")
        .warnings(false)
        .file("nimcache/fib.nim.c")
        .file("nimcache/stdlib_system.nim.c")
        .compile("fib_nim");
}

请注意,这里有几个与平台相关的位,主要是Nim标头位置。Nim编译器还被告知将中间文件放入nimcache项目根目录下的目录中,而不是用户主目录下的默认目录中。

Cargo.toml文件中:

[package]
name = "nim-ffi"
version = "0.1.0"
authors = ["rustacean"]
edition = "2018"

[dependencies]
libc = "0.2"

[build-dependencies]
cc = "1.0"

最后是主要的Rust源文件:

use libc::c_int;

extern "C" {
    fn NimMain();
    fn fib(_: c_int) -> c_int;
}

fn main() {
    // initialize nim gc memory, types and stack
    unsafe {
        NimMain();
    }

    let res = unsafe { fib(20) };
    println!("Nim fib(20) is: {}", res);
}

它构建并成功运行:

$ cargo run
Nim fib(20) is: 6765

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用ruby ffi gem在rust库中调用独立函数?

来自分类Dev

如何使用ruby ffi gem在rust库中调用独立函数?

来自分类Dev

从Rust FFI访问DPDK中的静态C函数

来自分类Dev

如何在C中调用Rust函数?

来自分类Dev

当通过FFI接口从Rust调用时,为什么Ada DLL会卡在adainit上?

来自分类Dev

如何通过指针调用函数?

来自分类Dev

C ++如何通过引用函数传递数组

来自分类Dev

是否可以通过命名其参数在Rust中调用函数?

来自分类Dev

通过引用从函数调用的C ++构造函数

来自分类Dev

通过引用从函数调用的C ++构造函数

来自分类Dev

如何通过调用函数(按引用调用)来更改std :: set元素?在C ++中

来自分类Dev

如何通过对C函数和类对象的外部调用来处理C ++头文件

来自分类Dev

如何在C ++中通过函数名称(std :: string)调用函数?

来自分类Dev

如何为可以通过其名称调用成员函数的c ++类提供函数

来自分类Dev

如何等待rust中的异步函数调用列表?

来自分类Dev

如何调用需要双指针缓冲的Rust函数

来自分类Dev

是否可以调用从C获取Vec的Rust函数?

来自分类Dev

如何通过c#mvc函数传递两个参数以调用存储过程

来自分类Dev

如何通过传递参数使用Java脚本/ jQuery调用C#(aspx.cs)函数

来自分类Dev

如何在C#中调用通过Structure Map实例化的类的构造函数

来自分类Dev

如何通过ajax调用的c#函数更改asp标签的文本

来自分类Dev

如何通过点击按钮调用类函数

来自分类Dev

如何通过成员变量调用函数?

来自分类Dev

如何通过不同的ID调用函数方法?

来自分类Dev

如何通过索引选择调用函数

来自分类Dev

如何通过不同的ID调用函数方法?

来自分类Dev

如何通过名称调用私有函数

来自分类Dev

如何通过javascript函数调用DAO方法?

来自分类Dev

通过HTML按钮调用C#函数

Related 相关文章

  1. 1

    如何使用ruby ffi gem在rust库中调用独立函数?

  2. 2

    如何使用ruby ffi gem在rust库中调用独立函数?

  3. 3

    从Rust FFI访问DPDK中的静态C函数

  4. 4

    如何在C中调用Rust函数?

  5. 5

    当通过FFI接口从Rust调用时,为什么Ada DLL会卡在adainit上?

  6. 6

    如何通过指针调用函数?

  7. 7

    C ++如何通过引用函数传递数组

  8. 8

    是否可以通过命名其参数在Rust中调用函数?

  9. 9

    通过引用从函数调用的C ++构造函数

  10. 10

    通过引用从函数调用的C ++构造函数

  11. 11

    如何通过调用函数(按引用调用)来更改std :: set元素?在C ++中

  12. 12

    如何通过对C函数和类对象的外部调用来处理C ++头文件

  13. 13

    如何在C ++中通过函数名称(std :: string)调用函数?

  14. 14

    如何为可以通过其名称调用成员函数的c ++类提供函数

  15. 15

    如何等待rust中的异步函数调用列表?

  16. 16

    如何调用需要双指针缓冲的Rust函数

  17. 17

    是否可以调用从C获取Vec的Rust函数?

  18. 18

    如何通过c#mvc函数传递两个参数以调用存储过程

  19. 19

    如何通过传递参数使用Java脚本/ jQuery调用C#(aspx.cs)函数

  20. 20

    如何在C#中调用通过Structure Map实例化的类的构造函数

  21. 21

    如何通过ajax调用的c#函数更改asp标签的文本

  22. 22

    如何通过点击按钮调用类函数

  23. 23

    如何通过成员变量调用函数?

  24. 24

    如何通过不同的ID调用函数方法?

  25. 25

    如何通过索引选择调用函数

  26. 26

    如何通过不同的ID调用函数方法?

  27. 27

    如何通过名称调用私有函数

  28. 28

    如何通过javascript函数调用DAO方法?

  29. 29

    通过HTML按钮调用C#函数

热门标签

归档