问题描述
我试图创建一个可由ac程序调用的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行,但所有行都是这种形式
#[no_mangle]
pub extern "C" fn fn_test() {
println!("Hello,world!");
}
呼叫者部分中包含的头文件为:
extern void fn_test();
问题是,在创建静态库或链接静态库时我出错了吗?还是将问题放在其他地方,并且它不能与静态库一起使用?我是否应该只使用动态方法(我希望避免这种方法,因为静态方法更像是在一个exe中使用多种语言,因为您不必分发该库)?
(免责声明:对于每个人问我为什么没有充分理由就要做这样的事情:这是一个有趣的项目,整个程序应该尽可能地复杂化,这就是我想使用其他语言的原因)
解决方法
在Linux上,std
动态链接到pthread和libdl。您还需要链接这些文件以创建可执行文件:
gcc main.o libCustomlib.a -lpthread -ldl
结果是一个二进制文件,该文件可以动态链接到少数基础库,但不能链接到Customlib。
如果要使用 really 静态链接的二进制文件,则可能需要使用no_std
并仅启用core
的不依赖于动态链接系统的特定功能。库。 (某些库不能在Linux上静态链接;请阅读Statically linking system libraries,libc,pthreads,to aid in debugging。仅对于像hello,world
这样的玩具程序,您可以简单地将-static
传递给gcc来摆脱困境,但是对于任何健壮的方法,最好动态链接这些基本库。