gcc - 创建和链接静态 rust 库并链接到 c

标签 gcc rust static-linking

我试图创建一个可由 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 )
错误都是对各种函数的 undefined reference
前几行:

/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 中使用多种语言,因为您不必分发库)?
(免责声明:对于每个问我为什么会在没有充分理由的情况下做这样的事情的人:这是一个有趣的项目,整个程序应该尽可能地过于复杂,这就是我想使用不同语言的原因)

最佳答案

在 Linux 上,std动态链接到 pthreads 和 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,但对于任何健壮的东西,最好动态链接这些基本库。

关于gcc - 创建和链接静态 rust 库并链接到 c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63617012/

相关文章:

linux - 编译 libgcc xgcc 错误

linux - 程序错误 : ./程序 : error while loading shared libraries: lib<xxx>. 所以:无法打开共享对象文件:没有这样的文件或目录

rust - 我需要帮助在不同的函数中使用可变引用

c - Matlab 编译器链接错误(64 位与 32 位)

c++ - Qt Qt5Network 链接错误的静态构建

c++ - 将 OpenMP 与 -fopenmp 和 -lgomp 链接起来的区别

c - 如何指示可以使用内联ASM参数*指向*的内存?

unit-testing - 如何编写确保编译错误的测试?

hex - 以十六进制表示形式显示 u8 切片

c++ - 如何从 GCC 中的 C/C++ 源代码获取汇编程序输出?