IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Chargement de ressources


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2010
    Messages : 18
    Par défaut Chargement de ressources
    Bonjour à tous,

    Cette question ne concerne pas forcément le langage C++, mais ayant cru comprendre que certains langages fournissent des mécanismes de chargement de ressources (java), et que je cherche une solution adaptée au C++, ce forum m'a paru le plus adapté.

    Il s'agit d'une question que je me pose depuis fort longtemps, à laquelle je n'ai jamais trouvé de réponse.

    Imaginons un programme (écrit en C++ par exemple ), qui a besoin de charger des fichiers au runtime. Typiquement, une image, un fichier de description de thème, bref, une ressource quelconque...

    Quelles sont les moyens existants, ou bonnes pratiques, pour rendre un programme conscient de son path d'installation ?
    Par exemple, imaginons que ce programme soit distribué sur une distribution linux qui place les fichiers de ressources dans /usr/share/monprog/. Le programme va alors chercher ses ressources dans /usr/share/monprog/.
    Si l'on avait préféré installer le programme dans le prefix /usr/local ou /opt , il faudrait bien sûr que le programme trouve ses ressources aux endroits adéquats.

    La question que je me pose alors est de savoir comment le programme peut faire les bons open() ou autres, bref, comment considérer ces chemins de ressources dans un programme que l'on veut distribuer. Quelles sont les bonnes façons de faire ? Est-ce du ressort du packager de faire ce qu'il faut ? Ou bien le développeur doit avoir préparé le terrain en amont ?

    Je ne sais pas si mes propos sont clairs, j'espère

    Merci d'avance pour vos réponses

  2. #2
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    En général, on n'utilise pas le nom complet.
    Par exemple, ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ifstream fs("fichier.txt");
    ouvrira le fichier "fichier.txt" dans le répertoire d'installation (enfin, ça dépend, mais il me semble que c'est ce qui est utilisé en général ...)

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    En général tu te moques bien du path d'installation.
    Tu utilises le path relatif à partir de celui où est exécuté le programme.

    > C:/user/ou/je/veux/pgm.exe
    > C:/user/ou/je/veux/resources/img.png

    > ouvrir resources/img.png
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2010
    Messages : 18
    Par défaut
    Merci beaucoup pour vos réponses,
    C'est en général comme ça que je m'y prends, effectivement (chemin relatif à l'emplacement de l'exécutable)

    Pourtant, sur les systèmes unix-like, on a souvent ce schéma là :
    exécutable : $prefix/bin/monprog
    ressources : $prefix/share/monprog/

    Dans ce cas, j'ai du mal à voir comment charger les fichiers proprement, un open(../share/monprog/) relativement à l'emplacement du binaire exécutable semblerait faire l'affaire, mais est-ce la bonne façon de procéder ?
    N'est-il pas préférable, d'une manière ou d'une autre, de pouvoir dissocier l'emplacement de l'exécutable et l'emplacement des ressources ? De manière à faire un open($resource_path/maressource.res), ou quelque chose de ce goût, quelque soit l'emplacement de l'exécutable ?

  5. #5
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    Auquel cas il y a une solution : le script ./configure ou le CMakeLists.txt (ou autre, je ne vais pas faire de la discrimination).

    En gros, il faut qu'à la compilation, un de ces scripts fasse un #define BASE_PATH "/usr/local" dans un fichier pré-configuré.
    En gros, il n'y a pas de moyen totalement portable, mais il est possible de reposer sur le système de compilation.

    Par exemple, CMake propose un moyen de "configurer" un fichier. De mémoire, ça implique de mettre un fichier comme config.hpp.in avec quelque chose comme #define BASE_PATH @base_path@, de définir la variable base_path dans CMake (il faudrait vérifier, ça doit être accessible dans les variables prédéfinies de CMake), puis d'appeller une fonction comme configure (nom à vérifier) sur le fichier, et d'include le fichier config.hpp (généré par CMake) en considérant qu'il contient le #define BASE_PATH.

    J'espère avoir été clair !

    EDIT : Un exemple (non testé, il peut être nécessaire d'ajouter des guillemets autour de @CMAKE_INSTALL_PREFIX@) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // main.cpp
    #include "config.hpp"
     
    #include <fstream>
     
    int main(int, char**) {
      std::ifstream(BASE_PATH "/share/file"); // Auto string concat : "a" "b" == "ab"
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // config.hpp.in
    #ifndef CONFIG_HPP
    #define CONFIG_HPP 1
     
    #define BASE_PATH @CMAKE_INSTALL_PREFIX@
     
    #endif // CONFIG_HPP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // CMakeLists.txt
    // Tout le bazar
    configure_file(config.hpp.in config.hpp @ONLY)
    // Tout le reste du bazar

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2010
    Messages : 18
    Par défaut
    Oui, ça me paraît clair
    Merci beaucoup pour cette réponse, le simple fait que tu évoques cette solution me rassure un peu.
    Je pense pouvoir marquer ce fil comme résolu, je me sens un peu moins paumé sur le sujet, merci encore pour ça

  7. #7
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    J'ai édité pour ajouter un exemple, ça pourrait t'éviter des recherches, s'il n'est pas trop tard.

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2010
    Messages : 18
    Par défaut
    Oh bien, que demande le peuple
    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de chargement des ressources statiques
    Par dims455 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/03/2013, 09h15
  2. Chargement de ressources dans un jar externe
    Par SQUAL dans le forum Langage
    Réponses: 1
    Dernier message: 13/01/2012, 16h51
  3. Chargement des ressources en début d'application
    Par womannosky dans le forum Langage
    Réponses: 7
    Dernier message: 11/07/2008, 17h05
  4. Problème de chargement de ressource
    Par ggounouman dans le forum Applets
    Réponses: 4
    Dernier message: 23/10/2007, 16h21
  5. [BP7] Problème chargement de ressource dans une DLL
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 26/07/2003, 21h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo