8 releases (major breaking)

7.0.0 Feb 10, 2017
6.0.0 Oct 1, 2016
5.0.0 Sep 2, 2016
4.0.0 Sep 2, 2016
0.2.0 May 13, 2016

#1 in #libloading

Download history 65/week @ 2019-11-08 61/week @ 2019-11-15 27/week @ 2019-11-22 73/week @ 2019-11-29 121/week @ 2019-12-06 52/week @ 2019-12-13 37/week @ 2019-12-20 22/week @ 2019-12-27 31/week @ 2020-01-03 39/week @ 2020-01-10 54/week @ 2020-01-17 35/week @ 2020-01-24 30/week @ 2020-01-31 41/week @ 2020-02-07 49/week @ 2020-02-14

226 downloads per month
Used in 16 crates (2 directly)

ISC license

63KB
809 lines

sharedlib Travis CI Appveyor CI

A cross-platform shared library loader.

(crates.io) (docs)

Based on libloading by Simonas Kazlauskas.

sharedlib is a crate for loading shared libraries at runtime. This is a useful primitive for implementing other things like plugins. The advantage of this crate over other shared library crates is that it provides both lifetime-bound and ref-counted libraries, and it allows both functions and data to be loaded.

Quickstart

To load a library you can use any of the Lib, LibTracked, or LibUnsafe structs. Each of these structs provides different guarantees. For more information about the guarantees they provide see the choosing your guarantees section in the docs. We use Lib for the examples below:

Calling a function in another library

unsafe {
    let path_to_lib = "examplelib.dll";
    let lib = try!(Lib::new(path_to_lib));
    let hello_world_symbol: Func<extern "C" fn()> = try!(lib.find_func("hello_world"));
    let hello_world = hello_world_symbol.get();
    hello_world();
}

Accessing data in another library

unsafe {
    let path_to_lib = "examplelib.dll";
    let lib = try!(Lib::new(path_to_lib));
    let my_usize_symbol: Data<usize> = try!(lib.find_data("my_usize"));
    let my_usize = my_usize_symbol.get();
    assert_eq!(*my_usize, 0);
}

Additional information

Plenty of additional information can be found in the docs.

Dependencies

~100KB