OVH Cloud OVH Cloud

Temps de compilation avec C++ sous Linux ?

20 réponses
Avatar
Xandros
Bonjour,

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

10 réponses

1 2
Avatar
noone
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

donc dans un premier temps tu écris


#include <iostream>
using namespace std;

void hello(void)
{
cout << "Hello world !" << endl;
}

int main(int argc, char** argv)
{
hello();
return EXIT_SUCCESS;
}

puis tu compiles avec ton Makefile


main: main.cc
g++ main.cc -o main


en tapant make


5.

Tu veux maintenant mettre la fonction hello() dans un autre fichier

Dans un premier temps on va la mettre dans le même fichier mais à la fin

#include <iostream>
using namespace std;

void hello(void);

int main(int argc, char** argv)
{
hello();
return EXIT_SUCCESS;
}

void hello(void)
{
cout << "Hello world !" << endl;
}


puis tu compiles avec ton Makefile


main: main.cc
g++ main.cc -o main

en tapant make

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
#include <iostream>
using namespace std;

void hello(void)
{
cout << "Hello world !" << endl;
}


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...


@+

Avatar
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...
Avatar
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().

#include <iostream>
using namespace std;

void hello(void)
{
cout << "Hello world !" << endl;
}


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

Avatar
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 ?
Avatar
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.

Avatar
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/


Avatar
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)

Avatar
Stan
a écrit dans le message de news:
42f5fc62$0$22285$

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)


Quelle genre de diffilcultés ?

--
-Stan

Avatar
noone
Quelle genre de diffilcultés ?


Je trouve que for_each n'est pas évident d'usage

Les foncteurs c'est quand même pas d'une évidence même

Avatar
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

1 2