创建和 linking 静态 rust 库和 link 到 c
Creating and linking static rust library and link to c
我试图创建一个可由 c 程序调用的 Rust 库,到目前为止,我设法创建了一个动态库并调用了它(使用 [=14= 创建的库],使用 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 中使用多种语言,因为您不必分发库)?
(免责声明:对于每个问我为什么没有充分理由做这样的事情的人:这是一个有趣的项目,整个程序应该尽可能复杂,这就是我想使用不同语言的原因)
在 Linux 上,std
动态地 link 到 pthreads 和 libdl。您还需要 link 这些来创建可执行文件:
gcc main.o libCustomlib.a -lpthread -ldl
结果是一个二进制文件,它 link 动态地发送到少数基础库,但静态地发送到 Customlib。
如果你想要一个 纯 静态 linked 二进制文件,你可能需要使用 no_std
并仅启用 [=13] 的特定功能=] 不依赖于动态 linked 系统库。 (某些库不能在 Linux 上静态 linked;阅读 Statically linking system libraries, libc, pthreads, to aid in debugging)对于像 hello, world
这样的玩具程序,您可以简单地将 -static
传递给gcc,但对于任何健壮的东西,最好动态地 link 这些基本库。
我试图创建一个可由 c 程序调用的 Rust 库,到目前为止,我设法创建了一个动态库并调用了它(使用 [=14= 创建的库],使用 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 中使用多种语言,因为您不必分发库)?
(免责声明:对于每个问我为什么没有充分理由做这样的事情的人:这是一个有趣的项目,整个程序应该尽可能复杂,这就是我想使用不同语言的原因)
在 Linux 上,std
动态地 link 到 pthreads 和 libdl。您还需要 link 这些来创建可执行文件:
gcc main.o libCustomlib.a -lpthread -ldl
结果是一个二进制文件,它 link 动态地发送到少数基础库,但静态地发送到 Customlib。
如果你想要一个 纯 静态 linked 二进制文件,你可能需要使用 no_std
并仅启用 [=13] 的特定功能=] 不依赖于动态 linked 系统库。 (某些库不能在 Linux 上静态 linked;阅读 Statically linking system libraries, libc, pthreads, to aid in debugging)对于像 hello, world
这样的玩具程序,您可以简单地将 -static
传递给gcc,但对于任何健壮的东西,最好动态地 link 这些基本库。