【问题标题】:Creating and linking static rust library and link to c创建和链接静态 rust 库并链接到 c
【发布时间】:2020-12-16 09:32:49
【问题描述】:

我试图创建一个可由 c 程序调用的 rust 库,到目前为止,我设法创建了一个动态库并调用它(使用rustc --crate-type=cdylib src/lib.rs -o libCustomlib.so 创建的库,使用gcc main.o -lCustomlib 链接)。

当我现在采用相同的代码但将其编译为静态库 (rustc --crate-type=staticlib src/lib.rs -o libCustomlib.a) 时 gcc 在链接时抛出错误(使用 gcc main.o -L. -l:libCustomlib.a

错误都是对各种函数的未定义引用

前几行:

/usr/bin/ld: ./libCustomlib.a(std-b1b61f01951b016b.std.5rqysbiy-cgu.2.rcgu.o): in function `std::sys::unix::mutex::Mutex::init':
/usr/src/rustc-1.43.0//src/libstd/sys/unix/mutex.rs:46: undefined reference to `pthread_mutexattr_init'
/usr/bin/ld: /usr/src/rustc-1.43.0//src/libstd/sys/unix/mutex.rs:48: undefined reference to `pthread_mutexattr_settype' 
/usr/bin/ld: /usr/src/rustc-1.43.0//src/libstd/sys/unix/mutex.rs:52: undefined reference to `pthread_mutexattr_destroy' 

完整的错误超过 100 行,但这些行都是这种形式

lib.rs 目前只有一个测试 helloWorld 函数:

#[no_mangle]
pub extern "C" fn fn_test() {
    println!("Hello, world!");
}       

调用者部分包含的头文件是:

extern void fn_test();

问题是,我是在创建静态库还是在链接它时出错?或者问题出在其他地方,它不应该与静态库一起使用?我是否应该只使用动态方法(我想避免这种方法,因为静态方法更像是在一个 exe 中使用多种语言,因为您不必分发库)?

(免责声明:每个人都在问为什么我会在没有充分理由的情况下做这样的事情:这是一个有趣的项目,整个程序应该尽可能复杂,这就是我想使用不同语言的原因)

【问题讨论】:

    标签: gcc rust static-linking


    【解决方案1】:

    在 Linux 上,std 动态链接到 pthread 和 libdl。您还需要链接这些以创建可执行文件:

    gcc main.o libCustomlib.a -lpthread -ldl
    

    生成的二进制文件动态链接到少数基本库,但静态链接到 Customlib。

    如果您想要一个静态链接的二进制文件,您可能需要使用no_std 并仅启用不依赖于动态链接系统库的core 的特定功能。 (某些库不能在 Linux 上静态链接;请阅读 Statically linking system libraries, libc, pthreads, to aid in debugging)对于像 hello, world 这样的玩具程序,您可以简单地将 -static 传递给 gcc,但对于任何强大的东西,最好动态链接这些基础库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多