Devcpp - compilation en cascade

nobpn Messages postés 13 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 9 janvier 2006 - 7 nov. 2005 à 21:07
meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007 - 10 nov. 2005 à 10:06
Bonjour à tous,



J'aimerais savoir comment faire (si possible) avec devcpp pour que si il me trouve pas la lib il la compile.



Je m'explique :

dans le source, j'inclue des .hpp avec tout le code qui va bien !!!



compilation : no probleme. C'est au "linkage" qu'il me mets des erreurs
dans tous les sens : "Undefined reference" à des fonctions qu'ils
connait qui sont bien dans les .hpp.



Je croi que comme les hpp sont pas compilé, il connait pas les fonctions.



Bref comment faire si j'ai été clair!!!



D'avance merci à bientot!


--------------------------------------------------
Me... That's all, that's enough!
--------------------------------------------------

7 réponses

meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
8 nov. 2005 à 00:43
Bonsoir,

Oui, tu as été très clair. Mais les *.hpp sont ce que l'on nomme des fichiers d'en-têtes (headers, includes, ou comme on veut...). La vocation de ceux-ci n'est que de fournir une déclaration de fonction(s) qui peut (peuvent) ou non être définies dans le programme même. Cette déclaration permet au compilateur de parvenir à transformer les fichiers *.cpp en fichiers "objet".

Lors que ces fonctions ne sont pas définies dans le programme que tu souhaites compilées, ces routines sont implémentées dans :
- soit un objet partagé (un *.DLL sous Microsoft Windows ; un *.SO sous GNU/Unix) ;
- soit une librairie dite statique (à quelque chose près la même chose, mis à part le fait que l'ensemble du contenu de la librairie sera inclus dans le programme compilé).

Mais sans la définition de ces routines, ne disposant donc que de leur déclaration, le "linkage" des fichiers *.o s'écroule.

Donc, sans *.dll, sans *.lib ou sans *.a, je ne crois pas qu'il soit possible de linker le programme. Sauf part l'appel dynamique d'objet partagé, comme l'un de mes petits bouts de code sans prétention le démontre http://www.cppfrance.com/code.aspx?id=28739.

Peux-tu spécifier la librairie qu'il te manque ?

En espérant t'avoir aidé un tantinet,
Bonne nuit ;-)
0
nobpn Messages postés 13 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 9 janvier 2006
8 nov. 2005 à 10:39
--------------------------------------------------
Me... That's all, that's enough!
--------------------------------------------------
0
nobpn Messages postés 13 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 9 janvier 2006
8 nov. 2005 à 10:50
oups trompé de bouton...



Merci pour ta réponse. J'ai bien compris le programme avec call et libhello.



En fait tu a prescompilé "libhello" que tu donne a ton programme "call" si j'ai bien tout compris...



Mon probleme a moi est que si je mmodifie une de mes classes jaimerais
que devcpp me recompile tout, la classe (car elle a changée) et mon
main.



En fait il sagit d'un projet d' info de l'année dernière (donc sources
inconnues mais a^res examen : multiples dépendances entre les classes)
que je dois reprendre et améliorer : j'ai reussi a compiler sous linux
avec un joli makefile qui recompile toutes les dépendances entre les
"fichiers".



Exemple :

dans le main



#include "include/SquareLight.hpp"
...

SquareLight * lightsource new SquareLight ( xxx, yyy, zzz);> linker error Undefined reference to SquareLight::SquareLight(type1,type2,type3)



J'aimerais que comme il "voit" que le main dépend de ma classe
Squarelight.cpp il me refasse le Squarelight.o ou Squarelight.a qui lui
est nécessaire.



Dsl pour le code je connais pas la balise pour cppfrance.



Merci

Schuuuuuuuuuuuus


--------------------------------------------------
Me... That's all, that's enough!
--------------------------------------------------
0
meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
8 nov. 2005 à 12:16
Salut,



En fait, si j'ai bien compris, tu bosses :

1. Sur une (ou plusieurs) librairie(s) contenue(s) dans des projets différents que le programme principal ;

2. Un projet Dev-C++ relatif au programme principal.




Alors là, c'est différent, je crois qu'il va falloir que tu joues avec
le Makefile.win construit automatiquement par Dev-C++ ou alors, essaie
d'en créer un comme tu l'as fait sous linux, en le spécifiant dans les
"options du projet"...




Le but étant alors de
compiler les librairies une à une puis, en dernier ressort, de compiler
le programme final en étant attentif aux chemins des librairies et aux
dénominations des librairies à inclure...



A plus.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nobpn Messages postés 13 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 9 janvier 2006
9 nov. 2005 à 18:17
Bonjour.



J'ai reussi a compiler sous windows avec un makefile linux.

Je fais juste un make dans la console "cmd" et ca me genere toutes les librairies .a.



Il me reste 2 problemes :

- Quand je donne ce Makefile a Devcpp il me marque une erreur à la compil :

.../Makefile [Build Error] No rule to make target `all'. Stop.



- Quand je compile sous linux : programme nikel. Sous windows : il démarre puis plante.

Il s'agit bien sur d'un programme totalement console/C++.



Ne connaissant rien aux makefile j'ai recopié le makefile linux pour le faire marcher sous windows. je la pose en code :






INCDIR=include

# FLAGS=-g -W -Wall -Wno-deprecated

FLAGS=-O3 -W -Wall -Wno-deprecated

export CC=g++

export AR=ar -ru

export LIB=RTR

EXE=Photon3.exe



# pour repertoire courant

LCFLAGS=${FLAGS} -I${INCDIR}

LDFLAGS=-L./ -l${LIB}

# pour les submakes

export INCPATH=../${INCDIR}

export CFLAGS=${FLAGS} -I../${INCDIR}

export OUTPUT=../lib${LIB}.a



SUFF=.exe

TARGETS=libRTRMisc.a libRTRColor.a libRTRLight.a libRTRGeometry.a
libRTRRayTracing.a libRTRScene.a libRTRStruct.a libRTRVecmat.a
libRTRBRDF.a  libRTRCSG.a  libRTRPhoton.a libRTRObjects.a
Main.o



##libRTRNURBS.a 



#####################################################################



RTR: libRTR.a

    ${CC} ${CFLAGS} Main.o -o ${EXE} ${LDFLAGS}



libRTR.a: ${TARGETS}

    ${AR} libRTR.a Main.o



Main.o: Main.cpp

    ${CC} ${LCFLAGS} -c Main.cpp  -o Main.o



libRTRLight.a:

    make -e -C lights libRTRLight.a



libRTRVecmat.a:

    make -e -C Vecmat libRTRVecmat.a



libRTRColor.a:

    make -e -C color libRTRColor.a



libRTRGeometry.a:

    make -e -C geometry libRTRGeometry.a



libRTRMisc.a:

    make -e -C misc libRTRMisc.a



libRTRObjects.a:

    make -e -C objects libRTRObjects.a



libRTRRayTracing.a:

    make -e -C raytracing libRTRRayTracing.a



libRTRScene.a:

    make -e -C scene libRTRScene.a



libRTRStruct.a:

    make -e -C structures libRTRStruct.a



libRTRBRDF.a:

    make -C brdf libRTRBRDF.a



libRTRCSG.a:

    make -e -C csg libRTRCSG.a





libRTRPhoton.a:

    make -e -C photon libRTRPhoton.a



################



clean: distclean



distclean:

    rm -f core *~ Main.o ${EXE}${SUFF} ${EXE} ${INCPATH}/*~

    make -e -C lights clean

    make -e -C color clean

    make -e -C geometry clean

    make -e -C misc clean

    make -e -C objects clean

    make -e -C raytracing clean

    make -e -C scene clean

    make -e -C structures clean

    make -e -C brdf clean

    make -e -C Vecmat clean

    make -e -C csg clean

    make -e -C photon clean



mrproper: distclean

    rm -f *.stackdump *.ppm *.a *.ppm




--------------------------------------------------
Me... That's all, that's enough!
--------------------------------------------------
0
nobpn Messages postés 13 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 9 janvier 2006
9 nov. 2005 à 18:25
Grrrrrrrrrrr j'arrive pas a m'u faire a c forum.



J'ai oublié : merci d'vance a bientot.

--------------------------------------------------
Me... That's all, that's enough!
--------------------------------------------------
0
meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
10 nov. 2005 à 10:06
Salut,



A priori, il manque une cible "all" dans ton Makefile
pour tout construire, du genre :

all: RTR

[éventuellement d'autres trucs à faire].



Ici, la section all n'est qu'une sorte de "pointeur" vers la cible où est construit ton exécutable, c'est-à-dire RTR.



Ciao.



PS. Hein, c'est pénible aussi les Makefile ?
0
Rejoignez-nous