59 个版本

0.14.25 2024年6月20日
0.14.24 2024年3月16日
0.14.22 2024年2月8日
0.14.18 2023年5月21日
0.5.1 2021年7月30日

#185 in FFI

Download history 77/week @ 2024-05-02 41/week @ 2024-05-09 57/week @ 2024-05-16 161/week @ 2024-05-23 146/week @ 2024-05-30 84/week @ 2024-06-06 67/week @ 2024-06-13 328/week @ 2024-06-20 164/week @ 2024-06-27 115/week @ 2024-07-04 32/week @ 2024-07-11 46/week @ 2024-07-18 526/week @ 2024-07-25 80/week @ 2024-08-01 20/week @ 2024-08-08 10/week @ 2024-08-15

651 每月下载量
用于 2 crates

MIT 许可证

185KB
3K SLoC

Interoptopus 生成 C 绑定。

用法

假设您已经编写了一个包含 FFI 逻辑的 crate,称为 example_library_ffi,并希望生成 C 绑定,请按照以下说明操作。

在您的库中

向您编写的库添加 Interoptopus 属性,并定义一个列出所有要导出符号的清单函数。所有支持的结构的概述可以在 参考项目 中找到。

use interoptopus::{ffi_function, ffi_type, Inventory, InventoryBuilder, function};

#[ffi_type]
#[repr(C)]
pub struct Vec2 {
    pub x: f32,
    pub y: f32,
}

#[ffi_function]
#[no_mangle]
pub extern "C" fn my_function(input: Vec2) -> Vec2 {
    input
}

pub fn my_inventory() -> Inventory {
    InventoryBuilder::new()
        .register(function!(my_function))
        .inventory()
}

将这些添加到您的 Cargo.toml 中,以便可以找到属性和绑定生成器(将 ... 替换为最新版本)

[lib]
crate-type = ["cdylib", "rlib"]

[dependencies]
interoptopus = "..."
interoptopus_backend_c = "..."

tests/bindings.rs 中创建一个单元测试,该测试将在使用 cargo test 运行时生成您的绑定。在实际项目中,您可能希望将此代码添加到另一个 crate 中

use interoptopus::util::NamespaceMappings;
use interoptopus::{Error, Interop};

#[test]
fn bindings_c() -> Result<(), Error> {
    use interoptopus_backend_c::{Config, Generator};

    Generator::new(
        Config {
            ifndef: "example_library".to_string(),
            ..Config::default()
        },
        example_library_ffi::my_inventory(),
    ).write_file("bindings/c/example_complex.h")?;

    Ok(())
}

现在运行 cargo test

如果您有任何不清楚的地方,可以在 GitHub 上的示例 中找到。

生成的输出

以下输出可能是后端可能生成的。如果您想自定义某些内容,请查看 Config 结构体。如果您真的不喜欢某些内容的生成方式,可以轻松地 创建自己的

// Automatically generated by Interoptopus.

#ifndef example_library
#define example_library

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include <stdbool.h>

typedef struct vec2
    {
    float x
    float y;
    } vec2;


vec2 my_function(vec2 input);

#ifdef __cplusplus
}
#endif

#endif /* example_library */

依赖项