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é`
3 Réponses :
cargo run
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>
En fin de compte, il n'y a rien de mal avec rustc
ou cargo
ou la façon dont vous les exécutez.
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 code> 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.
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.
Veuillez montrer quelles commandes exactes vous exécutez et quels messages exacts elles produisent.