前言
创建动态/静态库
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…