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 :

Différence ./main et exécutable main


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Par défaut Différence ./main et exécutable main
    Bonjour,
    Voila j'ai un petit problème dont je ne vois pas bien la source. J'ai créé un petit programme me permettant de calculer des trucs (osef) et de me les sortir sous forme de données en .dat. Mon programme marche au poil mais je rencontre un problème avec l'exécutable lors qu'il est seul. Je m'explique. J'ai regroupé les différentes parties de mon code dans un dossier avec un makefile. J'ouvre le dossier dans un terminal je tape "make" puis "./main" et là le programme roule: il calcul puis il me sort mes .dat. Le problème intervient lorsque je compile mon code, "make", puis ferme le terminal et double clic sur mon exécutable. Le terminal s'ouvre, les calculs s'effectuent mais je n'ai aucun .dat qui sort? Comment est-ce possible?!

    Merci de votre aide.

    Mon Makefile si ça peut aider:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    ##############################
    # Makefile du TP Projet
    ##############################
     
     
    #Chemin pour utiliser Vecteur.o
    VECTEUR=./Vecteur
     
    OBJECTS = main.o  EDO2.o $(VECTEUR)/Vecteur.o
    all: main
     
    COMPILCOMMAND=g++ -std=c++11  -I$(VECTEUR)  -c -o $@   $<
     
    # Commande generique 
    %.o: %.cpp %.h
    	$(COMPILCOMMAND)
     
    #commande pour l’executable
    %.o: %.cpp 
    	$(COMPILCOMMAND)
     
    # Fichiers source a generer
    EDO2.o: EDO2.h
    main.o:          EDO2.h  
     
    # Creation de l'executable
    main: $(OBJECTS)
    	g++ -std=c++11 -o main $(OBJECTS)  -lgsl -lgslcblas 
     
    # Commande de nettoyage
    clean:
    	rm -f *.o main *.dat *~

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 774
    Par défaut
    C'est le "working directory" qui change

    À la console tu forces la racine de ton exécutable avec "./"

    Alors que lorsque tu double cliques dessus, le "working directory" c'est peut-être ton "home", peut-être "/bin", peut-être "/user/bin" ...

    Il faut soit afficher le "working directory" (avec une interruption pour le voir *) soit rechercher le fichier ".dat" à partir de la racine "/" (éventuellement regarder dans 2-3 dossiers connus avant)


    * -> Soit avec un Sleep de X secondes soit avec une boîte de dialogue

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Par défaut
    J'ai oublié de l'expliciter, je suis une vraie bite dans ce domaine
    Comme faire exactement? Merci.

    Ah oui, je vois ce que tu veux dire. Effectivement après vérification mes .dat on bien été envoyés à la racine de mon pc. Mais du coup comment faire en sorte qu'ils soient créés dans le même dossier que mon exécutable? La manip se fait au niveau du make file ou du fstream?

    Bon j'ai essayé plein de chose mais rien ne marche...
    Voila où j'en suis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string filename= "./Résultats/Diffusion-L="+to_string(barriere)+"nm-E="+to_string(Energie)+"eV.dat";
     
        ofstream fichier(filename);

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 774
    Par défaut
    Je ne connais pas Linux (enfin si mais pas l'API C/ C++), mais je vois 2 trucs :


  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Par défaut
    En fait le problème c'est que mon code est amené à être utilisé pas d'autres personnes, mes profs en l'occurence. Du coup j'aimerais que peu importe où se trouve le programme il me crache mes .dat dans le même dossier.
    Il n'y a pas moyen récupéré le répertoire de l'exécutable et de l'insérer comme fonction de mon ofstream?

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 774
    Par défaut
    Je ne connais pas Linux (enfin si mais pas l'API C/ C++), mais as-tu regardé le argv[0]?

    Dans ton main, il y a 2 paramètres main(int argc, char* argv[]).
    Et le argv[0] est souvent/ toujours le nom de l'exécutable. Peut-être qu'il y a un chemin?

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Par défaut
    Citation Envoyé par momovelo Voir le message
    J'ai oublié de l'expliciter, je suis une vraie bite dans ce domaine
    Comme faire exactement? Merci.
    J'ai appris le code il y a six mois. Alors c'est bien beau de me traiter de branleur mais ça ne m'aide pas vraiment...
    De plus, désolé de ne pas vous l'avoir précisé, je code sous mac (famille unix).

  8. #8
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 774
    Par défaut
    Citation Envoyé par momovelo Voir le message
    J'ai appris le code il y a six mois. Alors c'est bien beau de me traiter de branleur mais ça ne m'aide pas vraiment...
    Pas de branleur, mais ne pas avoir de réflexes

    Il y a Internet et des sites références pour décrire toutes les méthodes standards: Tu ne vois pas ce que fait un bout de code, et tu vois std::rfind ou std::npos: réflexe je vais voir.

    Savoir ce qu'il y a dans une variable (ici argv[0]): réflexe 2 lignes de code et un point d'arrêt.

    Un problème, réflexe: stackoverflow ou un autre (une fois que le problème est dégagé, parce que des fois c'est le brouillard )


    Citation Envoyé par momovelo Voir le message
    De plus, désolé de ne pas vous l'avoir précisé, je code sous mac (famille unix).
    Et tu te plains en ayant les 2 meilleurs compilateurs C++ : gcc et clang.

    Par contre effectivement le truc du "/proc/XXX_PID/exe" cela va passer moyen-moyen: il faut tester

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Par défaut
    Rah il ne veut vraiment pas!
    Je viens de coder ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <unistd.h>
    #include <limits.h>
    char buff[PATH_MAX + 1];
        char *cwd = getcwd( buff, PATH_MAX + 1 );
    cwd retourne le working directory (je le stocke dans WD). Maintenant dans mon ofstream je fais simplement ofstrem fichier(WD+filename);
    Quand je fais un petit cout<<WD+filename j'ai bien le répertoire où je veux que mes .dat sortent.
    Mais le problème persiste, lorsque je lance le main seul, les .dat disparaissent...

Discussions similaires

  1. Différence entre .h, .cpp, main
    Par guy16 dans le forum Débuter
    Réponses: 3
    Dernier message: 30/04/2015, 12h17
  2. Exécution main(int argc,char **argv)
    Par jadoud dans le forum Visual Studio
    Réponses: 1
    Dernier message: 28/01/2012, 14h34
  3. Réponses: 0
    Dernier message: 10/05/2010, 13h19
  4. Repère main gauche à repère main droite
    Par Bob.Killer dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2008, 16h09
  5. int main() vs void main()
    Par yorukaze dans le forum C++
    Réponses: 26
    Dernier message: 25/06/2007, 23h12

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