1
votes

Rust ne compile pas en exécutable sous Linux

La compilation de rust sous Linux avec rustc ou cargo build produit une bibliothèque partagée au lieu d'un fichier exécutable.
Mon gestionnaire de fichiers (thunar) et la commande file affichent ce type de fichier comme bibliothèque partagée.

Et le binaire compilé ne peut être exécuté que via le terminal par $ / path / to / file ou $ cargo run .
Ce fichier ne peut pas être exécuté simplement en double-cliquant comme d'autres exécutables peuvent l'être.
Sortie de la commande file :

$ file rust_bin

rust_bin: objet partagé ELF 64 bits LSB, x86_64, version 1 (SYSV), lié dynamiquement, interpréteur /lib64/ld-linux-x86-64.so.2, pour GNU / Linux 3.2.0, BuildID [ sha1] = cb8cd ..., avec debug_info, non dépouillé`


1 commentaires

Veuillez montrer quelles commandes exactes vous exécutez et quels messages exacts elles produisent.


3 Réponses :


-1
votes
cargo run

0 commentaires

9
votes
  1. Votre compilateur produit un fichier exécutable. Il n'y a pas de grande différence entre une bibliothèque partagée et un fichier exécutable lié dynamiquement. Ils suivent le même format de base. La chaîne interpréteur /lib64/ld-linux-x86-64.so.2, pour GNU / Linux 3.2.0 indique qu'il s'agit d'un exécutable et non d'une bibliothèque. Les bibliothèques n'ont normalement pas de jeu d'interpréteurs. Essayez d'exécuter file sur certains fichiers dont vous savez qu'ils sont des exécutables, et d'autres fichiers que vous connaissez sont des bibliothèques, et voyez par vous-même. Un interpréteur est généralement un petit programme système qui charge et exécute un objet partagé. Un fichier peut en fait servir à la fois de bibliothèque et d'exécutable (l'exemple le plus courant est votre libc.so.6 ou quel que soit son nom sur votre système; essayez de l'exécuter). < / li>
  2. Si vous pouvez exécuter cet exécutable depuis votre shell mais pas depuis votre gestionnaire de fichiers, le problème vient du gestionnaire de fichiers, pas de l'exécutable. Vous devrez peut-être indiquer spécifiquement au gestionnaire de fichiers que votre programme doit s'exécuter dans un terminal. Cela peut généralement être fait en créant un fichier .desktop qui décrit votre programme. En outre, les outils de bureau peuvent mal reconnaître les exécutables modernes en tant que bibliothèques partagées. Ceci est un problème courant. Il peut également être résolu en créant un fichier .desktop pour votre exécutable. Il n'est en aucun cas spécifique de la rouille.

En fin de compte, il n'y a rien de mal avec rustc ou cargo ou la façon dont vous les exécutez.


5 commentaires

Il est exécutable, il peut être exécuté dans le terminal ./file mais pas depuis le gestionnaire de fichiers (thunar xfce4), il semble que le gestionnaire de fichiers ne reconnaît pas les bibliothèques partagées et ne les exécute pas car d'autres exécutables peuvent être exécutés simplement à partir du gestionnaire de fichiers et produire la même sortie à partir du file commamd. J'ai trouvé quelque chose en rapport sur launchpad.net Les bibliothèques partagées ne sont pas exécuté par les gestionnaires de fichiers


@Amiy "semble que le gestionnaire de fichiers ne reconnaît pas les bibliothèques partagées". Non, ce n'est pas ce qui se passe ici. Le fichier est un exécutable et non une bibliothèque partagée. Les rapports de bogue parlent d'un bogue / d'une mauvaise configuration dans l'interface graphique. Il pense que le fichier est une bibliothèque partagée, alors que ce n'est pas le cas. Rien à voir avec rustc vraiment.


@Amiy Apparemment, c'est un bug courant. Sur ma machine, je ne peux pas exécuter aucun exécutable depuis un gestionnaire de fichiers. Je n'utilise jamais de gestionnaire de fichiers, donc je ne l'aurais pas découvert par moi-même.


RUSTFLAGS = "- C relocation-model = dynamic-no-pic link-args = -no-pie" cargo build produit un exécutable.Et gcc -no-pie src.c pour gcc .J'utilise généralement vim ou nano mais j'ai juste essayé aujourd'hui de l'exécuter à partir du gestionnaire de fichiers et ce n'est pas le cas.Comme je pensais que si je donne le binaire à quelqu'un d'autre, ils ne pourront pas l'exécuter sans ouvrir le terminal.Cela se produit également avec les programmes compilés avec GCC, que j'utilise l'option -no-pie ou non. Le problème est donc avec les gestionnaires de fichiers GUI.


@Amiy si vous donnez votre programme à quelqu'un et que vous vous attendez à ce qu'il utilise l'interface graphique, vous devriez également lui donner un fichier .desktop et une icône de toute façon.



0
votes

Lorsque vous créez votre projet initialement, vous pouvez simplement utiliser cargo new (ou init) pour obtenir le bon type

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);
}

lorsque vous utilisez rustc, vous pouvez utiliser une option de ligne de commande p >

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

Votre découverte sur l'objet partagé induit en erreur votre recherche d'erreurs: https : //askubuntu.com/questions/690631/executables-vs-shared-objects - ce n'est pas un problème, un exécutable peut être un objet partagé.

Je pense que dans votre cas, le problème en est une autre. Que fait ton binaire? Est-ce que tout simplement imprimer quelque chose via stdout et c'est tout? C'est peut-être la raison pour laquelle un double-clic dans le navigateur de fichiers de l'interface graphique ne vous montre rien, il exécute une milliseconde et se termine avant que vous ne le sachiez. fonction? Juste pour que l'utilisateur puisse lire la sortie et appuyer sur la touche Retour.

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

Je ne sais pas comment thunar va le gérer mais finalement il ouvrira un terminal et affichera le résultat et le fermera le terminal lorsque vous appuyez sur Entrée.


0 commentaires