Back

/ 3 min read

在Windows环境中研究Rust动态库与静态库

前言

创建动态/静态库

Terminal window
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
}

否则符号表中找不到我们定义的函数,在链接时就会出现错误。

静态库

Terminal window
cargo new test_lib --lib

修改Cargo.toml文件,添加crate-type属性,使其生成一个静态库。

[package]
name = "test_lib"
version = "0.1.0"
edition = "2021"
[dependencies]
[lib]
crate-type=["staticlib"]

编译生成静态库

Terminal window
cargo build --release

创建一个C++文件

test.cpp
#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;
}

编译链接

Terminal window
g++ .\test.cpp .\target\release\test_lib.lib -o test.exe

结果:

image-20240804142651445

动态库

TODO…