Руст не компилируется в исполняемый файл в Linux - PullRequest
0 голосов
/ 29 января 2019

Компиляция ржавчины в Linux с rustc или cargo build создает общую библиотеку вместо исполняемого файла.
Мой файловый менеджер (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, без удаления`

Ответы [ 3 ]

0 голосов
/ 29 января 2019
  1. Ваш компилятор создает исполняемый файл.Нет большой разницы между разделяемой библиотекой и динамически связанным исполняемым файлом.Они следуют одному и тому же основному формату.Строка interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0 указывает, что это исполняемый файл, а не библиотека.В библиотеках обычно нет набора переводчиков.Попробуйте запустить file для некоторых файлов, которые, как вы знаете, являются исполняемыми файлами, а некоторые другие файлы, которые вы знаете, являются библиотеками, и убедитесь сами.Интерпретатор - это обычно небольшая системная программа, которая загружает и выполняет общий объект.Файл может фактически служить одновременно и библиотекой, и исполняемым файлом (наиболее распространенный пример - это libc.so.6 или как он там вызывается в вашей системе; попробуйте запустить его).
  2. Если вы можете запуститьэтот исполняемый файл из вашей оболочки, но не из вашего файлового менеджера, проблема с файловым менеджером, а не с исполняемым файлом.Возможно, вам придется специально указать файловому менеджеру, что ваша программа должна работать в терминале.Обычно это можно сделать, создав файл .desktop, который описывает вашу программу.Кроме того, инструменты рабочего стола могут неправильно распознавать современные исполняемые файлы как общие библиотеки. Это - общая проблема.Это тоже можно исправить, создав файл .desktop для вашего исполняемого файла.Это не является специфическим для ржавчины в любом случае.

В итоге, нет ничего плохого в rustc или cargo или в способе их запуска.

0 голосов
/ 29 января 2019

Когда вы изначально создаете свой проект, вы можете просто использовать 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.

0 голосов
/ 29 января 2019
cargo build

создает исполняемый файл в target / debug / rust_bin Затем просто

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

для выполнения или просто

cargo run

PS: вам нужно создать Cargo.Томл файл с соответствующими данными внутри.

...