Je veux me mettre au C++, j'ai donc acheter un livre sur le C++ (ça
aide) et j'ai installé Anjuta sous Linux Debian.
J'ai un AMD 3000+ avec 1Gho de RAM, donc c'est pas trop une vieux coucou.
J'ai tapé mon premier programme, il fait 10 lignes, un genre de "Hello
World". ça met 3 secondes à compiler et 2 secondes à construire ! je
trouve ça un peu long ? non ?
Le jour où je vais avoir un programme de 1000 lignes, ça va mettre 300
secondes (soit 5 minutes) à compiler + 200 secondes (soit 3 minutes 30)
à construire ? si il faut attendre 8 minutes 30 pour savoir si y a un ug !!!
J'ai bidouillé un peu sous VB et delphi sous Windows et la compilation,
même pour des programmes de + de 1000 lignes était presque instantané.
Alors, y a un bug ? ou bien c'est normal ?
Merci
--
Message envoyé avec Thunderbird
Sous Linux Xandros 3.0 Deluxe
Merci à tous pour vos réponses, apparement faire un Makefile peu optimiser la compilation ?
Je ne sais pas encore ce que c'est qu'un Makefile, j'en suis à la page 47 du bouquin :)
@+
Pour comprendre un peu le Makefile je te conseille de faire l'essai suivant :
1 : faire un hello world classique
// main.cc #include <iostream> using namespace std;
int main(int argc, char** argv) { cout << "Hello world !" << endl; return EXIT_SUCCESS; }
tu peux compiler en tapant en ligne de commande g++ main.cc -o main
où -o signifie output c'est à dire sortie donc c'est le nom de l'executable
voici le Makefile de base (pas de prérequis)
all: g++ main.cc -o main
(attention la ligne g++ commence par une tabulation... pas par des espaces !)
tu compiles en tapant make
2 Le problème : chaque fois que tu tapes make ça recompile (même si tu n'as pas modifié main.cc)
Il faut donc modifier le Makefile pour indiquer la dépendance à main.cc
tu peux par exemple écrire ça à la place de ton Makefile
main: main.cc g++ main.cc -o main
tu tape make et ça compile
sans modifier main.cc tu retapes make
make: « main » est à jour.
Donc ça ne compile pas pour rien
3 Tu es un peu feignant et réécrire main.cc et main dans la ligne de compilation ça te barde donc tu utilises les raccourcis
ton Makefile devient alors
main: main.cc g++ $< -o $@
(bon je sais les raccourcis ne sont pas très parlant... mais info make te les donne)
$@ Le nom de la cible $< Le nom de la première dépendance $^ La liste des dépendances $? La liste des dépendances plus récentes que la cible $* Le nom du fichier sans suffixe
4
Maintenant tu veux que cout << "Hello world !" << endl; soit dans une fonction
Tu peux alors compiler ***séparémement*** main.cc et hello.cc (avec l'option -c de gcc)
Regarde !
g++ main.cc -c
donne un fichier objet main.o
g++ hello.cc -c
donne un fichier objet hello.o
Il ne reste plus qu'à les lier
g++ hello.o main.o -o main
et l'executable main (-o = output = sortie)
./main permet d'executer
Maintenant regardons le Makefile
main: main.o hello.o g++ $^ -o $@
main.o: main.cc g++ $< -c
hello.o: hello.cc g++ $< -c
Il suffit de taper make et ça roule... ;-)
ça compile main.cc pour faire main.o ça compile hello.cc pour faire hello.o ça link hello.o et main.o pour faire l'executable main
Et voila... ton premier Makefile de base... plus d'info sur le net...
@+
Bonjour,
Merci à tous pour vos réponses, apparement faire un Makefile peu
optimiser la compilation ?
Je ne sais pas encore ce que c'est qu'un Makefile, j'en suis à la page
47 du bouquin :)
@+
Pour comprendre un peu le Makefile je te conseille de faire l'essai
suivant :
1 : faire un hello world classique
// main.cc
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
cout << "Hello world !" << endl;
return EXIT_SUCCESS;
}
tu peux compiler en tapant en ligne de commande
g++ main.cc -o main
où -o signifie output c'est à dire sortie donc c'est le nom de l'executable
voici le Makefile de base (pas de prérequis)
all:
g++ main.cc -o main
(attention la ligne g++ commence par une tabulation... pas par des
espaces !)
tu compiles en tapant make
2
Le problème : chaque fois que tu tapes make ça recompile (même si tu
n'as pas modifié main.cc)
Il faut donc modifier le Makefile pour indiquer la dépendance à main.cc
tu peux par exemple écrire ça à la place de ton Makefile
main: main.cc
g++ main.cc -o main
tu tape make et ça compile
sans modifier main.cc tu retapes make
make: « main » est à jour.
Donc ça ne compile pas pour rien
3
Tu es un peu feignant et réécrire main.cc et main dans la ligne de
compilation ça te barde donc tu utilises les raccourcis
ton Makefile devient alors
main: main.cc
g++ $< -o $@
(bon je sais les raccourcis ne sont pas très parlant... mais info make
te les donne)
$@ Le nom de la cible
$< Le nom de la première dépendance
$^ La liste des dépendances
$? La liste des dépendances plus récentes que la cible
$* Le nom du fichier sans suffixe
4
Maintenant tu veux que cout << "Hello world !" << endl; soit dans une
fonction
Merci à tous pour vos réponses, apparement faire un Makefile peu optimiser la compilation ?
Je ne sais pas encore ce que c'est qu'un Makefile, j'en suis à la page 47 du bouquin :)
@+
Pour comprendre un peu le Makefile je te conseille de faire l'essai suivant :
1 : faire un hello world classique
// main.cc #include <iostream> using namespace std;
int main(int argc, char** argv) { cout << "Hello world !" << endl; return EXIT_SUCCESS; }
tu peux compiler en tapant en ligne de commande g++ main.cc -o main
où -o signifie output c'est à dire sortie donc c'est le nom de l'executable
voici le Makefile de base (pas de prérequis)
all: g++ main.cc -o main
(attention la ligne g++ commence par une tabulation... pas par des espaces !)
tu compiles en tapant make
2 Le problème : chaque fois que tu tapes make ça recompile (même si tu n'as pas modifié main.cc)
Il faut donc modifier le Makefile pour indiquer la dépendance à main.cc
tu peux par exemple écrire ça à la place de ton Makefile
main: main.cc g++ main.cc -o main
tu tape make et ça compile
sans modifier main.cc tu retapes make
make: « main » est à jour.
Donc ça ne compile pas pour rien
3 Tu es un peu feignant et réécrire main.cc et main dans la ligne de compilation ça te barde donc tu utilises les raccourcis
ton Makefile devient alors
main: main.cc g++ $< -o $@
(bon je sais les raccourcis ne sont pas très parlant... mais info make te les donne)
$@ Le nom de la cible $< Le nom de la première dépendance $^ La liste des dépendances $? La liste des dépendances plus récentes que la cible $* Le nom du fichier sans suffixe
4
Maintenant tu veux que cout << "Hello world !" << endl; soit dans une fonction
Tu peux alors compiler ***séparémement*** main.cc et hello.cc (avec l'option -c de gcc)
Regarde !
g++ main.cc -c
donne un fichier objet main.o
g++ hello.cc -c
donne un fichier objet hello.o
Il ne reste plus qu'à les lier
g++ hello.o main.o -o main
et l'executable main (-o = output = sortie)
./main permet d'executer
Maintenant regardons le Makefile
main: main.o hello.o g++ $^ -o $@
main.o: main.cc g++ $< -c
hello.o: hello.cc g++ $< -c
Il suffit de taper make et ça roule... ;-)
ça compile main.cc pour faire main.o ça compile hello.cc pour faire hello.o ça link hello.o et main.o pour faire l'executable main
Et voila... ton premier Makefile de base... plus d'info sur le net...
@+
noone
j'ai oublié de préciser les autotools permettent de créer automatiquement un Makefile
Une fois que tu as pris ça en main tout logiciel se compile et s'installe via les 3 "fameuses" commandes Linux
./configure make make install
en fait
c'est plutôt
su (pour devenir root) puis make install
configure permet de créer le Makefile (après vérification des bibliothèques nécessaires, de la présence du compilateur, etc...)
make interprète le Makefile pour compiler le programme
make install : installe le programme
ensuite comme les autotools sont assez standard (sous Linux) il est même possible de transformer automatiquement tes sources en paquet logiciel binaire (.rpm ou .deb)
donc Autotools... c'est l'étape suivante... mais il faut déjà faire plus qu'un Hello World pour que ça soit rentable ;-)
En plus je pense que ça devient un peu HS ici...
j'ai oublié de préciser
les autotools permettent de créer automatiquement un Makefile
Une fois que tu as pris ça en main tout logiciel se compile et
s'installe via les 3 "fameuses" commandes Linux
./configure
make
make install
en fait
c'est plutôt
su (pour devenir root) puis
make install
configure permet de créer le Makefile (après vérification des
bibliothèques nécessaires, de la présence du compilateur, etc...)
make interprète le Makefile pour compiler le programme
make install : installe le programme
ensuite comme les autotools sont assez standard (sous Linux) il est même
possible de transformer automatiquement tes sources en paquet logiciel
binaire (.rpm ou .deb)
donc Autotools... c'est l'étape suivante... mais il faut déjà faire plus
qu'un Hello World pour que ça soit rentable ;-)
j'ai oublié de préciser les autotools permettent de créer automatiquement un Makefile
Une fois que tu as pris ça en main tout logiciel se compile et s'installe via les 3 "fameuses" commandes Linux
./configure make make install
en fait
c'est plutôt
su (pour devenir root) puis make install
configure permet de créer le Makefile (après vérification des bibliothèques nécessaires, de la présence du compilateur, etc...)
make interprète le Makefile pour compiler le programme
make install : installe le programme
ensuite comme les autotools sont assez standard (sous Linux) il est même possible de transformer automatiquement tes sources en paquet logiciel binaire (.rpm ou .deb)
donc Autotools... c'est l'étape suivante... mais il faut déjà faire plus qu'un Hello World pour que ça soit rentable ;-)
En plus je pense que ça devient un peu HS ici...
Falk Tannhäuser
wrote:
6. on peut maintenant mettre tout ça dans 3 fichiers
main.cc hello.cc hello.h
//main.cc #include <iostream> using namespace std;
#include "hello.h"
int main(int argc, char** argv) { hello(); return EXIT_SUCCESS; }
//hello.h void hello(void);
//hello.cc
J'ajouterais ici #include "hello.h" ce qui permet au compilateur de vérifier la cohérence entre la déclaration et la définition de la fonction hello().
Tu peux alors compiler ***séparémement*** main.cc et hello.cc (avec l'option -c de gcc)
Regarde !
g++ main.cc -c
donne un fichier objet main.o
g++ hello.cc -c
donne un fichier objet hello.o
Il ne reste plus qu'à les lier
g++ hello.o main.o -o main
et l'executable main (-o = output = sortie)
./main permet d'executer
Maintenant regardons le Makefile
main: main.o hello.o g++ $^ -o $@
Puis il faut ajouter le fichier hello.h à la liste des dépendances des .o car une modification de ce fichier nécessite une récompilation:
main.o: main.cc main.o: main.cc hello.h
g++ $< -c
hello.o: hello.cc hello.o: hello.cc hello.h
g++ $< -c
Dans les grands projets, avec des centaines des fichiers #include directs et indirects, la génération manuelles des dépendances devient vite ingérable. Heureusement, et capable de les générer, il suffit de lui passer l'option -M (ou -MM, ce qui est normalement suffisant).
Falk
noone@nowhere.com wrote:
6. on peut maintenant mettre tout ça dans 3 fichiers
main.cc hello.cc hello.h
//main.cc
#include <iostream>
using namespace std;
#include "hello.h"
int main(int argc, char** argv)
{
hello();
return EXIT_SUCCESS;
}
//hello.h
void hello(void);
//hello.cc
J'ajouterais ici
#include "hello.h"
ce qui permet au compilateur de vérifier la cohérence entre la
déclaration et la définition de la fonction hello().
Tu peux alors compiler ***séparémement*** main.cc et hello.cc (avec
l'option -c de gcc)
Regarde !
g++ main.cc -c
donne un fichier objet main.o
g++ hello.cc -c
donne un fichier objet hello.o
Il ne reste plus qu'à les lier
g++ hello.o main.o -o main
et l'executable main (-o = output = sortie)
./main permet d'executer
Maintenant regardons le Makefile
main: main.o hello.o
g++ $^ -o $@
Puis il faut ajouter le fichier hello.h à la liste des dépendances
des .o car une modification de ce fichier nécessite une récompilation:
main.o: main.cc
main.o: main.cc hello.h
g++ $< -c
hello.o: hello.cc
hello.o: hello.cc hello.h
g++ $< -c
Dans les grands projets, avec des centaines des fichiers #include
directs et indirects, la génération manuelles des dépendances devient
vite ingérable. Heureusement, et capable de les générer, il suffit
de lui passer l'option -M (ou -MM, ce qui est normalement suffisant).
6. on peut maintenant mettre tout ça dans 3 fichiers
main.cc hello.cc hello.h
//main.cc #include <iostream> using namespace std;
#include "hello.h"
int main(int argc, char** argv) { hello(); return EXIT_SUCCESS; }
//hello.h void hello(void);
//hello.cc
J'ajouterais ici #include "hello.h" ce qui permet au compilateur de vérifier la cohérence entre la déclaration et la définition de la fonction hello().
Tu peux alors compiler ***séparémement*** main.cc et hello.cc (avec l'option -c de gcc)
Regarde !
g++ main.cc -c
donne un fichier objet main.o
g++ hello.cc -c
donne un fichier objet hello.o
Il ne reste plus qu'à les lier
g++ hello.o main.o -o main
et l'executable main (-o = output = sortie)
./main permet d'executer
Maintenant regardons le Makefile
main: main.o hello.o g++ $^ -o $@
Puis il faut ajouter le fichier hello.h à la liste des dépendances des .o car une modification de ce fichier nécessite une récompilation:
main.o: main.cc main.o: main.cc hello.h
g++ $< -c
hello.o: hello.cc hello.o: hello.cc hello.h
g++ $< -c
Dans les grands projets, avec des centaines des fichiers #include directs et indirects, la génération manuelles des dépendances devient vite ingérable. Heureusement, et capable de les générer, il suffit de lui passer l'option -M (ou -MM, ce qui est normalement suffisant).
Falk
Fr
Merci beaucoup pour ces infos, même si je n'ai pas tout compris.
le C++ ça a l'air complexe quand même ? non ?
Merci beaucoup pour ces infos, même si je n'ai pas tout compris.
Merci beaucoup pour ces infos, même si je n'ai pas tout compris.
le C++ ça a l'air complexe quand même ? non ?
Fabien LE LEZ
On Sat, 6 Aug 2005 15:30:57 +0200, "" :
le C++ ça a l'air complexe quand même ? non ?
Je confirme que C++ est un langage passablement complexe. La bonne nouvelle, c'est qu'on n'est pas forcément obligé de connaître toutes les finesses du langage pour faire de belles choses avec.
On Sat, 6 Aug 2005 15:30:57 +0200, "Fr@d" <vbload@free.fr>:
le C++ ça a l'air complexe quand même ? non ?
Je confirme que C++ est un langage passablement complexe. La bonne
nouvelle, c'est qu'on n'est pas forcément obligé de connaître toutes
les finesses du langage pour faire de belles choses avec.
Je confirme que C++ est un langage passablement complexe. La bonne nouvelle, c'est qu'on n'est pas forcément obligé de connaître toutes les finesses du langage pour faire de belles choses avec.
Michel Michaud
Dans le message ,
On Sat, 6 Aug 2005 15:30:57 +0200, "" :
le C++ ça a l'air complexe quand même ? non ?
Je confirme que C++ est un langage passablement complexe. La bonne nouvelle, c'est qu'on n'est pas forcément obligé de connaître toutes les finesses du langage pour faire de belles choses avec.
Et ce qui est complexe en C++ sert à faire plus simplement des choses qui seraient très complexes à faire correctement dans d'autres langages. En tout cas, la plupart du temps :-)
-- Michel Michaud http://www.gdzid.com FAQ de fr.comp.lang.c++ : http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
Dans le message f4g9f1taouvnl25ka0e6rbskuri8t8lu3t@4ax.com,
On Sat, 6 Aug 2005 15:30:57 +0200, "Fr@d" <vbload@free.fr>:
le C++ ça a l'air complexe quand même ? non ?
Je confirme que C++ est un langage passablement complexe. La bonne
nouvelle, c'est qu'on n'est pas forcément obligé de connaître toutes
les finesses du langage pour faire de belles choses avec.
Et ce qui est complexe en C++ sert à faire plus simplement des
choses qui seraient très complexes à faire correctement dans
d'autres langages. En tout cas, la plupart du temps :-)
--
Michel Michaud mm@gdzid.com
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
Je confirme que C++ est un langage passablement complexe. La bonne nouvelle, c'est qu'on n'est pas forcément obligé de connaître toutes les finesses du langage pour faire de belles choses avec.
Et ce qui est complexe en C++ sert à faire plus simplement des choses qui seraient très complexes à faire correctement dans d'autres langages. En tout cas, la plupart du temps :-)
-- Michel Michaud http://www.gdzid.com FAQ de fr.comp.lang.c++ : http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
noone
le C++ ça a l'air complexe quand même ? non ?
ce dont je parle (Makefile, autotools, etc...) ça n'est pas du C++
Tu peux avoir un Makefile en LaTeX, en Python ou en ce que tu veux...
Bon sinon c'est vrai que le C++ n'est pas évident (moi j'avoue avoir pas mal de difficultés avec la Standard Template Library)
le C++ ça a l'air complexe quand même ? non ?
ce dont je parle (Makefile, autotools, etc...) ça n'est pas du C++
Tu peux avoir un Makefile en LaTeX, en Python ou en ce que tu veux...
Bon sinon c'est vrai que le C++ n'est pas évident (moi j'avoue avoir pas
mal de difficultés avec la Standard Template Library)
Les foncteurs c'est quand même pas d'une évidence même
Arnaud Meurgues
Xandros wrote:
Je ne sais pas encore ce que c'est qu'un Makefile, j'en suis à la page 47 du bouquin :)
Sur le web, on peut trouver des introductions rapides sur les makefiles, comme par exemple: http://gl.developpez.com/tutoriel/outil/makefile/ ou http://ariffart.club.fr/envprog/envprog04.html
-- Arnaud
Xandros wrote:
Je ne sais pas encore ce que c'est qu'un Makefile, j'en suis à la page
47 du bouquin :)
Sur le web, on peut trouver des introductions rapides sur les makefiles,
comme par exemple:
http://gl.developpez.com/tutoriel/outil/makefile/
ou
http://ariffart.club.fr/envprog/envprog04.html
Je ne sais pas encore ce que c'est qu'un Makefile, j'en suis à la page 47 du bouquin :)
Sur le web, on peut trouver des introductions rapides sur les makefiles, comme par exemple: http://gl.developpez.com/tutoriel/outil/makefile/ ou http://ariffart.club.fr/envprog/envprog04.html