首页 > 解决方案 > 具有导出 C 符号和静态链接 libstd 的 Rust 库

问题描述

我在 Postgres API 和我的 Rust 代码之间有一小部分包装器 C。我需要导出那些 C 函数,以便 Postgres 可以调用它。

dylibcdylib包我都试过了。dylib导出我期望的符号:

$ nm target/release/libfdwtrait.so | grep add_one
0000000000005ef0 T add_one
0000000000005ee0 T pg_finfo_add_one

但它需要一个 libstd 共享对象:

$ ldd target/release/libfdwtrait.so
    linux-vdso.so.1 (0x000000740050d000)
    libstd-6c11f2ad6c829596.so => not found
    libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x000000740049a000)
    libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000007400350000)
    /lib/ld-linux-aarch64.so.1 (0x00000074004e2000)

cdylib不导出我需要的 C 函数:

$ nm target/release/libfdwtrait.so | grep add_one
zsh: done       nm ../target/release/libfdwtrait.so | 
zsh: exit 1     grep --color=auto add_one

但也不需要共享对象

$ ldd ../target/release/libfdwtrait.so
    linux-vdso.so.1 (0x000000796a39b000)
    libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x000000796a31c000)
    libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x000000796a2f0000)
    libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x000000796a2ce000)
    libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x000000796a184000)
    /lib/ld-linux-aarch64.so.1 (0x000000796a370000)

源代码/fdw.c

PG_FUNCTION_INFO_V1(add_one);

Datum
add_one(PG_FUNCTION_ARGS)
{
  int32   arg = PG_GETARG_INT32(0);
  int32   result = call_from_c(arg);

  PG_RETURN_INT32(result);
}

src/lib.rs

#[no_mangle]
pub extern "C" fn call_from_c(i: libc::int32_t) -> libc::int32_t {
    i * 2
}

cdylib我需要和的一些属性dylib。不幸的是,它们似乎在 Cargo 代码库中被硬编码。

标签: postgresqlrustrust-cargo

解决方案


推荐阅读