Pages : 1
#1 Le 04/07/2007, à 22:23
- yohann
c++ compilation séparé
Bonjour,
Je m'interresse au c++ et je voudrais réaliser une compilation "à la main" de fichiers de classe basique histoire de comprendre comment ça marche.
J'ai 3 fichier main.cpp, Personnage.h Personnage.cpp
Personnage.cpp contient
#include <Personnage.h>
après fouille sur le net je ne trouve que cette commande:
g++ Personnage.cpp -c
est a lancer en premier mais elle m'envoie plein d'erreur (qui sont je pense induite par la première:
Personnage.cpp:1:24: erreur: Personnage.h : Aucun fichier ou répertoire de ce type
alors que Personnage.h existe dans le meme repertoire que Personnage.cpp.
PS: j'ai essayé suivant les instruction sur d'autre forum les option -lm a la fin de la ligne mais rien y fait...
je crois pourtant procéder de la bonne manière, une idée?
merci pour votre aide
Dernière modification par yohann (Le 05/07/2007, à 08:31)
j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.
Hors ligne
#2 Le 04/07/2007, à 22:29
- Link31
Re : c++ compilation séparé
Essaie ça (je ne sais pas si c'est vraiment indispensable) :
#include "Personnage.h"
Tu peux aussi essayer d'ajouter -I. à la commande de compilation.
Hors ligne
#3 Le 04/07/2007, à 22:41
- yohann
Re : c++ compilation séparé
incroyable ça marche avec des " a la place des < quelqu'un a une explication?
merci link31 en tout cas!
j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.
Hors ligne
#4 Le 04/07/2007, à 22:48
- Link31
Re : c++ compilation séparé
Les <> sont normalement utilisés pour les fichiers d'inclusion système. Habituellement, les fichiers d'inclusion propres à l'application sont inclus avec " ".
Cette syntaxe permet certainement de les rechercher dans le répertoire courant.
Hors ligne
#5 Le 05/07/2007, à 08:31
- yohann
Re : c++ compilation séparé
ok merci pour l'explication
j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.
Hors ligne
#6 Le 05/07/2007, à 11:26
- Clop'
Re : c++ compilation séparé
Je rajouterais meme que <blabla.h> ne va faire chercher blabla.h QUE dans les repertoires d'includes systèmes alors que "blabla.h" inclut le fichier indiqué donc "blabla.h" indique le fichier blabla.h dans le répertoire courant et "truc/blabla.h" celui dans le sous-répertoire truc du répertoire courant.
----------------------
Linux on the Root , un site qu'il fait bon feuilleter!
----------------------
PyQtRadio, un lecteur de webradio simple et léger! Installation multi-distrib'
Hors ligne
#7 Le 07/07/2007, à 16:29
- mrf
Re : c++ compilation séparé
Une petite remarque, le -lm ne pouvait pas aider car -l veut dire que le code compilé sera "lié" à la biliothèque m (enfin libm.a ou libm.so selon que c'est statique ou dynamique, mais on va passer ces détails )
Or, libm est juste une lib de mathématiques elle contient des fonctions simples comme la racine carrée et un peu de trigo je pense.
Ce n'est donc pas une solution miracle pour tous les problèmes
Hors ligne
#8 Le 08/07/2007, à 16:19
- yohann
Re : c++ compilation séparé
merci pour toutes ces précisions, car le but n'était pas tellement de compiler mais plutôt de comprendre comment ça fonctionne...
donc ce que j'ai compris pour l'instant:
J'ai Personnage.h, Personnage.cpp et main.cpp qui utilise la library Personnage.h
il faut dans le main.cpp avoir
#include "Personnage.h" et non <Personnage.h> c'est à dire que <> et "" font la même chose mais avec des Path différents, syteme pour le premier, repertoire courant pour le 2ème.
g++ -c Personnage.cpp permet de compiler uniquement le fichier Personnage.cpp (avec son Personnage.h et va générer Personnage.o)
ensuite je sais aussi que g++ -o exec Personnage.cpp main.cpp va compiler et éditer les liens pour me crer l'executable exec.
par contre j'ignore encore comment compiler uniquement main.cpp utilisant Personnage.o mais sans recompiler Personnage.cpp.
Mais je sens que je progresse...
j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.
Hors ligne
#9 Le 08/07/2007, à 16:33
- AuraHxC
Re : c++ compilation séparé
Maintenant il te reste plus qu'a regarder makefile pour faire de beau fichier qui contient tes commandes de compilation et ainsi au lieu de taper tes g++ tu tape juste make dans une console et ca t'execute toutes tes commandes
je trouve ca super sympa pour les compilations séparé
Hors ligne
#10 Le 08/07/2007, à 16:39
- dekans
Re : c++ compilation séparé
merci pour toutes ces précisions, car le but n'était pas tellement de compiler mais plutôt de comprendre comment ça fonctionne...
donc ce que j'ai compris pour l'instant:
J'ai Personnage.h, Personnage.cpp et main.cpp qui utilise la library Personnage.h
il faut dans le main.cpp avoir
#include "Personnage.h" et non <Personnage.h> c'est à dire que <> et "" font la même chose mais avec des Path différents, syteme pour le premier, repertoire courant pour le 2ème.
g++ -c Personnage.cpp permet de compiler uniquement le fichier Personnage.cpp (avec son Personnage.h et va générer Personnage.o)
ensuite je sais aussi que g++ -o exec Personnage.cpp main.cpp va compiler et éditer les liens pour me crer l'executable exec.
par contre j'ignore encore comment compiler uniquement main.cpp utilisant Personnage.o mais sans recompiler Personnage.cpp.
Mais je sens que je progresse...
g++ -o exec main.cpp Personnage.o
dekans@jabber.kubuntu-fr.org
Hors ligne
#11 Le 08/07/2007, à 16:58
- yohann
Re : c++ compilation séparé
ok j'avais essayé dans l'autre sens et j'avais des erreur... (g++ -o exec Personnage.o main.cpp)
j'essaie ça tout de suite.
/tmp/cciraAjs.o: In function `main':
main.cpp:(.text+0xb7): undefined reference to `Personnage::Personnage(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld a retourné 1 code d'état d'exécution
ben nom...
pourtant avec les cpp ça fonctionne
bizarre
Dernière modification par yohann (Le 08/07/2007, à 17:00)
j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.
Hors ligne
#12 Le 08/07/2007, à 17:52
- Link31
Re : c++ compilation séparé
par contre j'ignore encore comment compiler uniquement main.cpp utilisant Personnage.o mais sans recompiler Personnage.cpp.
On suppose que tu as déjà lancé :
g++ -c Personnage.cpp
Tu as donc un fichier Personnage.o.
Pour compiler uniquement main.cpp en utilisant le Personnage.o déjà construit, il faut faire :
g++ -c main.cpp
qui donne main.o, puis :
g++ -o exec main.o Personnage.o
Hors ligne
#13 Le 08/07/2007, à 18:29
- dekans
Re : c++ compilation séparé
Pas besoin de faire de main.o
Par contre j'ai effectivement supposé qu'il avaitt deja compilé le Personnage.o mais sans lui dire
dekans@jabber.kubuntu-fr.org
Hors ligne
#14 Le 08/07/2007, à 18:45
- yohann
Re : c++ compilation séparé
j'avais déja compiler le Personnage.cpp et j'avais bien un Personnage.o mais j'ai qd même eu l'ereur;
par contre je n'ai pas compiler le main.o avant, j'essaie de suite!
bon alors je comprend pas très bien:
si je compile Personnage.cpp (g++ -c Personnage.cpp)
puis main.cpp (g++ -c main.cpp)
puis main.o et Personnage.o (g++ -o exec Personnage.o main.o)
ça fonctionne
si je compile tout à la fois (g++ -o exec Personnage.cpp main.cpp)
je génére un exec et des fichiers.o
mais ceux ci ne permettent pas d'utiliser la commande g++ -o exec Personnage.o main.o même si je ne change rien entre les 2 commandes
Dernière modification par yohann (Le 08/07/2007, à 19:14)
j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.
Hors ligne
#15 Le 08/07/2007, à 19:27
- dekans
Re : c++ compilation séparé
1 g++ -c Personnage.cpp --> tu compile l'objet Personnage.o
2 g++ -o exec main.cpp Personnage.o --> tu compile ton main.cpp avec ton objet Personnage.o
et le
#include "Personnage.h"
tu dois l'avoir dans main.cpp aussi,
j'avais pas lu ton erreur mais c'est ca.
Dernière modification par dekans (Le 08/07/2007, à 19:28)
dekans@jabber.kubuntu-fr.org
Hors ligne
#16 Le 08/07/2007, à 21:55
- gene69
Re : c++ compilation séparé
2 g++ -o exec main.cpp Personnage.o --> tu compile ton main.cpp avec ton objet Personnage.o
c'est crade comme explication.
La vérité c'est différent. On a le droit de te le dire si tu fais de la compilation séparée.
La vérité c'est qu'il y a DEUX étapes lors de la production d'un exécutable depuis le code.
1/ la première étape c'est la compilation proprement dite. en plusieurs sous-étapes comme le tour de france:
le précompilateur vire les commentaires et dans les versions primitives des compilateurs C produit un fichier temporaire unique en remplacant les #include par le fichier effectif (donc c'est un truc assez long qui résulte). La conséquence c'est que tu dois empecher toi même l'inclusion récursive avec les #define. Et parfois il faut que que tu prédéclares une classe ou une structure, l'exemple type c'est ce que tu fais lorsque tu commences à travailler sur les listes dynamiques.
2/ la seconde étape c'est une analyse lexicale+syntaxique, étape assez compliqué qui débouche sur du "code 3 adresses", de base, c'est une sorte d'"assembleur universel"
2.5/ c'est l'optimisation du code 3 a adresses (optionnel) suppression de code inutile...
3/ production de code pour la plateforme ciblée avec les instructions du processeur cide ex 86x.
MAIS
la vie serai belle si la compilation s'arrêtait là. Malheureusement on fait de la compilation séparée. Donc ça sous entend que certaine parties du code sont compilées séparément malgré les inclusions à l'étape 1. Il y a des variables qui sont partagées sur plusieurs fichiers (ex extern en C) qui ne sont pas remplacées par une adresse relative mais par un symbole typiquement ".text+0xb7". Parce que cette variable n'a pas de sens dans ce morceau uniquement. (en fait le .h crée des symbole et le .c .cpp donne le code du symbole). Bref on colle tous les morceaux ensemble on serre très fort, on secoue le cocotier, les symboles tombent : c'est l'édition de lien.
Pourquoi la citation me déplais c'est qu'elle cache cet aspect des choses. Le problème c'est que gcc est trop fort il sait faire ET la compile ET l'édition de lien et sans broncher il compile si c'est implicite qu'il faut compiler. alors que -c ça signifie compiler uniquement, -o éditer les liens.
dans les makefile tu trouveras $CC comme variable pour désigner le compilateur et $LD pour le linker.
j'ajouterai que les packageurs ubuntu font des choix dans les options par défaut de gcc et ça apporte parfois des bugs bizarres sur les vieux programmes (voir -fno-stack-protector ).
(il se peut qu'il y ai une ou deux inexactitudes... j'ai pas mes cours sous les yeux).
Dernière modification par gene69 (Le 08/07/2007, à 21:56)
Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion
Hors ligne
#17 Le 08/07/2007, à 22:41
- dekans
Re : c++ compilation séparé
le 'avec' résumait de facon très succincte l'édition de lien ^^
ce qu'il n'a pas forcément besoin de savoir.
et -o exec c'est juste pour appeler son binaire 'exec' (si j'ai pas mal compris ce que tu as écrit)
dekans@jabber.kubuntu-fr.org
Hors ligne
#18 Le 09/07/2007, à 12:31
- gene69
Re : c++ compilation séparé
-o: ... exact man gcc dit qu'il signifie renomer la sortie.
-c: le manuel dit " ne pas éditer les liens".
Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion
Hors ligne
#19 Le 09/07/2007, à 12:46
- yohann
Re : c++ compilation séparé
le 'avec' résumait de facon très succincte l'édition de lien ^^
ce qu'il n'a pas forcément besoin de savoir.
si justement j'aimerais le savoir! dans le cas présent je m'interresse moins à la production de l'executable qu'a la compréhension du processus de compilation!
ce que je ne m'explique pas c'est que j'ai 3 sorte de fichier:
.h, .cpp et .o
g++ -o exec main.cpp fichier.cpp me donne main.o, fichier.o et exec.
g++ -o exec main.o fichier.o me donne une erreur
MAIS
g++ -c fichier.cpp me donne fichier.o => ok
g++ -c main.cpp me donne main.o => ok
g++ -o exec main.o fichier.o me donne mon executable.
La question est donc quelle est la différence entre les .o générer avec la première méthode et la 2ème méthode.
Merci a vous pour les explication que vous l'avez déja fourni.
question subsidiaire: comment rendre gcc moins performant pour mieux comprendre ce qu'il se passe ?
J'ai écrit un tout petit projet trouvé sur le site du 0 : 2 bibliotheques de classe et un main, maintenant j'aimerais juste comprendre vraiment bien qui inclue quoi, et comment ce passe la compilation (mais j'ai pas été foutu de trouver un tuto sur comment comprendre la compilation, c'est pourquoi je vous suis reconnaissant de vos explication d'ailleurs).
j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.
Hors ligne
Pages : 1