Rust 创建并编译一个可供 C 或其他语言调用的动态链接库

发布于:2025-05-22 ⋅ 阅读:(18) ⋅ 点赞:(0)

 前言

最近在搞hook,正好看到这例子。于是就有了下文,使用rust 编写动态链接库,供c、c++ 语言调用。仅供参考。

// src/lib.rs
// 禁止编译器改名,使用 C 调用约定
#[no_mangle]
pub extern "C" fn hello() {
    // 
    println!("Hello from Rust .so!");
}

#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
    a + b
}

[package]
name = "pcrust"
version = "0.1.0"
edition = "2021"

[lib]
crate-type= ["cdylib"]

[dependencies]
libc = "0.2"
ctor = "0.1"
once_cell = "1.17"
simple_logger = "1.11"
log = "0.4"

创建c文件

#include <stdio.h>

// 
void hello(void);
int add(int a, int b);

int main() {
    hello();
    printf("3 + 4 = %d\n", add(3, 4));
    return 0;
}

连接生成的库文件 , 调用成功

bruce@bruce-Inspiron-3910:/data/pcrust$ gcc test.c -L target/release -lpcrust -o test
bruce@bruce-Inspiron-3910:/data/pcrust$ ls
Cargo.lock  Cargo.toml  src  target  test  test.c
bruce@bruce-Inspiron-3910:/data/pcrust$ ./test
./test: error while loading shared libraries: libpcrust.so: cannot open shared object file: No such file or directory
bruce@bruce-Inspiron-3910:/data/pcrust$ LD_LIBRARY_PATH=./target/release ./test
Hello from Rust .so!
3 + 4 = 7

说明:

gcc test.c \
    -L target/release \       # 库文件所在目录
    -lpcrust \                 # 链接 libpcrust.so
    -o test


网站公告

今日签到

点亮在社区的每一天
去签到