前言
创建动态/静态库
cargo new --lib mylib修改Cargo.toml文件,添加如下内容:
[lib]crate-type = ["cdylib", "staticlib"]crate-type的取值有:
staticlib:创建其他语言调用的静态库,在Windows下为.lib文件,在Linux下为.a文件。dylib:创建一个动态Rust库,在Windows下为.dll文件,在Linux下为.so文件。cdylib:创建其他语言调用的动态库,在Windows下为.dll文件,在Linux下为.so文件。rlib(默认):创建Rust调用的静态库,在Windows下为.rlib文件。
Rust的名称修饰
Rust的名称修饰规则与C++不同,但是也有名称修饰的存在,主要是因为Rust的函数名和参数名都是可以重载的,所以需要名称修饰来区分不同的函数。 贴一个华为的博客文章其中关于名称修饰的规则讲的很详细。
去除名称修饰
我们导出的函数需要通过#[no_mangle]来去除名称修饰,如下:
#[no_mangle]pub extern "C" fn add(a: i32, b: i32) -> i32 { a + b}否则符号表中找不到我们定义的函数,在链接时就会出现错误。
静态库
cargo new test_lib --lib修改Cargo.toml文件,添加crate-type属性,使其生成一个静态库。
[package]name = "test_lib"version = "0.1.0"edition = "2021"
[dependencies]
[lib]crate-type=["staticlib"]编译生成静态库
cargo build --release创建一个C++文件
#include <iostream>#include <cstdint>extern "C" { size_t add(size_t a, size_t b);}
int main(){ size_t a = 10, b = 20; size_t c = add(a, b); std::cout << "The sum of " << a << " and " << b << " is " << c << std::endl; return 0;}编译链接
g++ .\test.cpp .\target\release\test_lib.lib -o test.exe结果:
动态库
TODO…