【问题标题】:Rust not compiling to executable in LinuxRust 无法在 Linux 中编译为可执行文件
【发布时间】:2019-06-22 11:31:12
【问题描述】:

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

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

$ file rust_bin

rust_bin:ELF 64 位 LSB 共享对象,x86_64,版本 1 (SYSV),动态链接,解释器 /lib64/ld-linux-x86-64.so.2,用于 GNU/Linux 3.2.0,BuildID[ sha1]=cb8cd... ,带有 debug_info,未剥离`

【问题讨论】:

  • 请显示您正在运行的确切命令以及它们产生的确切消息。

标签: linux rust rust-cargo


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

归根结底,rustccargo 或您运行它们的方式没有任何问题。

【讨论】:

  • 它是可执行的,它可以在终端./file 中执行,但不能从文件管理器(thunar xfce4)执行,似乎文件管理器无法识别共享库并且无法执行它们,因为可以执行其他可执行文件只是从文件管理器并从file commamd 产生相同的输出。我在 launchpad.net Shared libraries not being executed by file mamagers 上发现了一些相关的东西
  • @Amiy “似乎文件管理器无法识别共享库”。不,这不是这里发生的事情。该文件是可执行文件而不是共享库。错误报告讨论了 GUI 中的错误/错误配置。它认为该文件是一个共享库,但实际上不是。真的与 rustc 无关。
  • @Amiy 显然这是一个常见的错误。在我的机器上,我无法从文件管理器运行 any 可执行文件。我从不使用文件管理器,所以我不会自己发现它。
  • RUSTFLAGS="-C relocation-model=dynamic-no-pic link-args=-no-pie" cargo build produces an executable.And gcc -no-pie src.c for gcc如果我将二进制文件提供给其他人,他们将无法在不打开终端的情况下执行它。无论我是否使用-no-pie 选项,使用 GCC 编译的程序也会发生这种情况。所以问题出在 GUI 文件管理器上。跨度>
  • @Amiy 如果您将程序提供给某人并希望他们使用 GUI,那么您也应该给他们一个 .desktop 文件和一个图标。
【解决方案2】:

当您最初创建项目时,您可以简单地使用 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 - 这不是问题,可执行文件可以是共享对象。

我认为你的问题是另一个问题。你二进制做什么?基本上只是通过标准输出打印一些东西,就是这样?也许这就是为什么在 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 时关闭终端。

【讨论】:

    【解决方案3】:
    cargo build
    

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

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

    执行,或者只是

    cargo run
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 2015-03-27
      相关资源
      最近更新 更多