Rust 未在 Linux 中编译为可执行文件

Rust not compiling to executable in Linux

使用 rustccargo build 在 Linux 上编译 rust 会生成共享库而不是可执行文件。
我的文件管理器 (thunar) 和 file 命令显示该文件类型为共享库。

并且编译后的二进制文件只能通过终端$ /path/to/file$ cargo run执行。
该文件不能像其他可执行文件那样仅通过双击即可执行。
file 命令的输出:

$ file rust_bin

rust_bin: ELF 64-bit LSB shared object, x86_64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=cb8cd... , with debug_info, not stripped`

cargo build

在 target/debug/rust_bin 中创建一个可执行文件 那么就

./target/debug/hello_cargo # or .\target\debug\hello_cargo.exe on Windows

执行,或者只是

cargo run

PS:您需要创建一个 Cargo.toml 文件,其中包含适当的数据。

  1. 您的编译器生成一个可执行文件。共享库和动态链接的可执行文件之间没有太大区别。它们遵循相同的基本格式。字符串 interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0 表示这是一个可执行文件而不是一个库。图书馆通常没有解释器集。尝试 运行ning file 一些你知道是可执行文件的文件,以及一些你知道是库的文件,然后你自己看看。解释器通常是加载和执行共享对象的小型系统程序。一个文件实际上可以同时作为一个库和一个可执行文件(最常见的例子是你的 libc.so.6 或你的系统上调用的任何东西;试试 运行ning 它)。
  2. 如果您可以 运行 从您的 shell 而不是从您的文件管理器中获取此可执行文件,则问题出在文件管理器上,而不是可执行文件上。您可能必须特别指示文件管理器您的程序应该 运行 在终端中。这通常可以通过创建一个描述您的程序的 .desktop 文件来完成。此外,桌面工具可能会将现代可执行文件错误地识别为共享库。 This 是一个常见问题。它也可以通过为您的可执行文件创建一个 .desktop 文件来补救。它不以任何方式特定于生锈。

最重要的是,rustccargo 或您对它们的 运行 方式都没有错。

最初创建项目时,您可以简单地使用 cargo new(或 init)来获取正确的类型

cargo new my_project_name
# OR create a lib project
cargo new --lib my_library_name

当您使用 rustc 时,您可以使用命令行选项

rustc lib.rs
# lib.rs has to contain a main function
# OR to build a lib
rustc --crate-type=lib lib.rs

您对共享对象的发现误导了您的错误查找:https://askubuntu.com/questions/690631/executables-vs-shared-objects - 这不是问题,可执行文件可以是共享对象。

我认为你的情况是另一个问题。你二进制做什么?基本上只是通过 stdout 打印一些东西,仅此而已?也许这就是为什么在 gui 文件浏览器中双击没有显示任何东西,它运行一毫秒并且在你知道之前就结束了。

你试过在主函数结束时等待输入吗?只是为了让用户可以阅读输出并按下 Return 键。

use std::io;
fn main() {
    // do and print stuff

    // Wait for return key
    let mut input = String::new();
    match io::stdin().read_line(&mut input);
}

不确定 thunar 将如何处理它,但最终他会打开一个终端并显示结果并在按下 enter 时关闭终端。