我正在使用Rust的编译选项来完成一个非常简单的项目,hello world:
fn main() {
println!("Hello, world!");
}
我正在使用此行编译,prefer-dynamic是唯一值得注意的选项:
rustc main.rs -o ./build/rci -C prefer-dynamic
它做得很好,直到我做了一些改变然后它没有。现在如果我尝试完全按照上面的方式编译代码,我得到这个输出:
./build/rci: error while loading shared libraries: libstd-2ddb28df747fcb8c.so: cannot open shared object file: No such file or directory
ldd的输出是:
linux-vdso.so.1 => (0x00007ffd321a4000)
libstd-2ddb28df747fcb8c.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f52eaef3000)
/lib64/ld-linux-x86-64.so.2 (0x000055f0f6251000)
这是在Ubuntu 17.04上使用Rust 1.15.1。
答案 0 :(得分:5)
你应该检查你的术语;在编程时,单词意味着具体的事您可以编译您的代码,如调用Rust编译器(a.k.a。rustc
)没有任何错误这样的事实所示。
执行程序时出现问题。这些是非常不同的概念,它将很好地帮助您理解差异。
“问题”是你正在使用动态链接,就像你要求的那样。这是不一个Rust问题,只是一般的编程问题。我确信有很多SO问题,例如Linux error while loading shared libraries: cannot open shared object file: No such file or directory或其中一个500 other questions with that error message可以为您提供更多信息。
您正在动态链接Rust标准库,但您的系统不知道该库,因为它未安装在您的系统所知的位置。最有可能的是,您已通过rustup安装,因此库位于您的主目录中。例如,我的是/home/ubuntu/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/libstd-f4594d3e53dcb114.so
。
您会找到许多可能的解决方案。最容易演示的是使用LD_LIBRARY_PATH
变量:
$ ./example
./example: error while loading shared libraries: libstd-f4594d3e53dcb114.so: cannot open shared object file: No such file or directory
$ LD_LIBRARY_PATH=/home/ubuntu/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/ ./example
Hello, world!
您还可以查看Linking Rust application with a dynamic library not in the runtime linker search path
为了帮助发现这一点,您可以制作Rust print out the linker invocation it uses:
$ rustc +nightly -Cprefer-dynamic -Z print-link-args hello.rs
"cc" "-m64" "-L" "/Users/shep/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib" "hello.hello0.rcgu.o" "hello.hello1.rcgu.o" "hello.hello2.rcgu.o" "hello.hello3.rcgu.o" "hello.hello4.rcgu.o" "hello.hello5.rcgu.o" "-o" "hello" "hello.crate.allocator.rcgu.o" "-Wl,-dead_strip" "-nodefaultlibs" "-L" "/Users/shep/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib" "-L" "/Users/shep/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib" "-l" "std-834fbefe8dbe98b5" "/Users/shep/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libcompiler_builtins-b4312e2f1496a4e4.rlib" "-l" "System" "-l" "resolv" "-l" "pthread" "-l" "c" "-l" "m"
您可以看到"-L" "/Users/shep/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib"
已添加到链接器路径,然后"-l" "std-834fbefe8dbe98b5"
链接标准库。