CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++ - SFML] Compilation Statique

elhuron
elhuron
Niveau 6
19 janvier 2009 à 20:32:52

Salut. :)

Je cherche a compiler un fichier de façon statique, et non dynamique, dans le but de pouvoir éxecuter l'exécutable sur un ordinateur ne possédant pas les bibliotèques que j'utilise dans ce programme.

Une autre solution serait de fournir les fichiers à inclure, ça devrais aussi fonctionner ?

Sur g++, il faut utiliser l'option -static, pour compiler de manière statique, et non dynamique, je rencontre quelques problèmes.

Lorsque j'essai cette fonctionnalité sur un programme tout simple n'incluant que iostream et stdlib, aucuns problèmes, j'y arrive.

Par contre, avec la SFML, c'est pas tout à fait la même chose.

Voici comment je compile de façon dynamique :
g++ main.cpp -lsfml-system -lsfml-window -lsfml-graphics -lsfml-audio

Da façon statique, avec la SFML, a priori, c'est comme ça :
g++ -static main.cpp -lsfml-system-s -lsfml-window-s -lsfml-graphics-s -lsfml-audio-s

Le résultat est identique si j'enlève les suffixes "-s", c'est à dire :
/usr/bin/ld: cannot find -lsfml-system-s
collect2: ld a retourné 1 code d'état d'exécution

Il me manque des fichiers .lib ou .a dans mon répertoire lib ? Car en ce moment, j'ai des fichiers xxx.so.1.5. J'ai même essayé avec les fichiers libs de la version windows, ça ca pas fonctionné, mais c'était à prévoir.

dnob700
dnob700
Niveau 10
19 janvier 2009 à 21:06:13

les .so sont l'équivalent des .dll de windows et ne serve que pour la compilations dynamique (en fait, pour l'exécution, ils ne servent pas à la compilation).

Pour la compilation, tu as besoin soit des .a soit des .o soit à la limite de .lib (ça dépend du compilo, mais cette dernière extension est rarement utilisé sous linux).

Si les bibliothèques statique ne sont pas diffusé dans les paquets de sfml, tu peut les compiler toit même.

Mais, sinon, es-tu sûr de vouloir faire ça ? Sous linux, c'est peu courant et ça ne sert à rien. Quelqu'un capable de télécharger ton programme et de l'installer, sera tout à fait capable d'installer aussi SFML. Ne pas diffuser d'exécutable static, c'est l'une des forces de Linux. Ça rend les programmes plus léger, le système plus réactif, ton programme est moins osumis au boges, etc. Ça n'a presque que des avantages.

elhuron
elhuron
Niveau 6
19 janvier 2009 à 21:56:22

Merci, je vais me renseigner sur la compilation de ces libs pour le statique.

Bah, c'est juste pour pouvoir exécuter mes programmes sur les ordinateurs à la fac, vu qu'ils ont pas les bibliotèques dynamiques d'installées pour sfml, je ne peux rien faire.

Sinon, dans pour tous les autres cas, j'éviterai ce genre de méthode, la taille de l'éxécutable devient énorme en statique.

Si on prend ce programme :

  1. include <iostream>
  2. include <stdlib.h>

int main (void)
{
std::cout << "Hello World !!!" << std::endl;
return EXIT_SUCCESS;
}

Il passe de 8.6Ko à 1.2Mo.

Sous windows j'utilisais jamais la compilation statique, je ne l'ai apprise et plus ou moins comprise que trop tard.

dnob700
dnob700
Niveau 10
19 janvier 2009 à 22:10:54

"Sous windows j'utilisais jamais la compilation statique, je ne l'ai apprise et plus ou moins comprise que trop tard. "

Oui, mais pendant longtemps ça a été le standard de facto sur cette OS dans de nombreux cas.

Dans tout cas, tu peut juste mettre les fichier .so dont tu as besoin avec ton exécutable pour le diffuser à la fac. Après pour le lancer, il te faut un petit script qui donne quelques options aux chargeur dynamique pour qu'il prenne en compte la version local des dll. Malheureusement, je ne connais pas les options nécessaires (mais quelqu'un d'autre pourra peut-être te les donner); essaye quelque chose comme :

LD_LIBRARY_PATH=. ./tonprogramme

Si tu es dans le dossier de ton programme et que les bibliothèque s'y trouvent aussi.

Dernière possibilité, tu peut essayer de linker dans ton programme les bibliothèques dynamiques :

Essaye :

ld -o nouveau ancien lib1 lib2 ...
Ou nouveau et ancien sont le nouveau et l'ancien nom de ton programme et libs sont les bibliothèques (avec le chemin complet) qu'il faut linker. Selon le format, tu peut réussir à linker les fichier .so dans ton programme (mais ça ne fonctionnera pas forcément, ton programme peut refuser de se lancer, ou planter à l'exécution, ou ld peut refuser de fonctionner (mais un message d'erreur ne veut pas dire qu'il n'a pas réussi)).

godrik
godrik
Niveau 30
19 janvier 2009 à 22:36:40

Pour faire une lib statique.
Il faut compiler tous les fichier c qui font ta lib independament en fichier .o avec gcc -c
ensuite il faut les reuir dans une archive avec la commande ar
ar -ra libtoto.a file1.o file2.o file3.o ...
tu peux donner se fichier a gcc comme si c'etait un fichier objet standard.
C'est comme cela que l'on est cense faire des lib statique sous linux.

Ca m'est arriver d'utiliser des lib statique dans des contextes ou ce n'etait pas vraiment une lib que je developpais mais un moteur d'execution que je pluggais dans differente code de rendu. Comme l'interface changait assez souvent, je preferais une lib statique a une lib dynamique.

Je m'en servait aussi pour produire du code pour game boy advance (pas de linker dynamique sur cette bete la)

dnob a bien vu pour la variable d'environement LD_LIBRARY_PATH fait ce que tu cherches. le systeme commence par chercher les lib dans LD_LIBRARY_PATH avant de chercehr dans les repertoires systeme standard.
Cette variable est peute tre deja defini sur ton systeme, je recommance donc plutot:
LD_LIBRARY_PATH=/mon/chemin:$LD_LIBRARY_PATH ./monprogramme

elhuron
elhuron
Niveau 6
27 janvier 2009 à 17:40:52

Merci ! :)

Comme indiqué ici : http://doc.ubuntu-fr.org/sfml
SFML necessite d'autres bibliotèques pour fonctionner pleinement.
J'ai tenté de récupérer les bons fichiers sur mon ordinateur, pas certain que ca fonctionnera.

Je vais donc commencer par essayer LD_LIBRARY_PATH.

Je vais aussi essayer de linker dynamiquement dans mon programme les bibliotèques.

Quand à créer la lib sfml statique, ca me semble plus compliqué. En effet, j'ai déjà compilé la sfml pour l'installer, mais ca s'est fait facilement, le makefile était déja prêt.

Si je n'y arrive pas avec les autres méthodes, j'essairai celle là. :)

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment