zoukankan      html  css  js  c++  java
  • 高级主题

    外部函数接口

    在Rust中,通过外部函数接口 (foreign function interface) 可以直接调用C语言库:

    extern crate libc;
    use libc::size_t;
    
    #[link(name = "snappy")]
    extern {
        fn snappy_max_compressed_length(source_length: size_t) -> size_t;
    }
    
    fn main() {
        let x = unsafe { snappy_max_compressed_length(100) };
        println!("max compressed length of a 100 byte buffer: {}", x);
    }

    其中#[link]属性用来指示链接器链接snappy库,extern块是外部库函数标记的列表。 外部函数被假定为不安全的,所以调用它们需要包装在unsafe块中。

    当然,我们也可以把Rust代码编译为动态库来供其它语言调用:

    // in embed.rs
    use std::thread;
    
    #[no_mangle]
    pub extern "C" fn process() {
        let handles: Vec<_> = (0..10).map(|_| {
            thread::spawn(|| {
                let mut _x = 0;
                for _ in (0..5_000_001) {
                    _x += 1
                }
            })
        }).collect();
    
        for h in handles {
            h.join().ok().expect("Could not join a thread!");
        }
    }

    其中#[no_mangle]属性用来关闭Rust的命名改编, 默认的应用二进制接口 (application binary interface) "C"可以省略。 然后使用rustc进行编译:

    $ rustc embed.rs -O --crate-type=dylib

    这将生成一个动态库libembed.so。在Node.js中调用该函数,需要安装ffi库:

    ```shell` $ npm install ffi

    
    ```js
    // in test.js
    var ffi = require('ffi');
    
    var lib = ffi.Library('libembed', {
      'process': [ 'void', [] ]
    });
    
    lib.process();
    
    console.log("done!");
    

    其中ffi.Library()用来加载动态库libembed.so, 它需要标明外部函数的返回值类型和参数类型 (空数组表明没有参数)。

  • 相关阅读:
    如何DIY陶瓷制作方法
    陶瓷的分类
    陶瓷
    机器视觉之——认知篇
    Halcon学习笔记(一)
    编程过程遇到的问题及解决方法
    前端技术——WebFont与Sprite
    HTML学习总结(四)【canvas绘图、WebGL、SVG】
    CSS3学习之——【特殊属性】
    HTML5学习总结——本地存储
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/8723f86fb457bc923145eba9c9d19af3.html
Copyright © 2011-2022 走看看