OVH Cloud OVH Cloud

dependances mal fichues

6 réponses
Avatar
Zulfukar Arslan
Bonjour a tous,

J'ai un repertoire d'executables ainsi qu'un repertoire contenant les
sources d'une librairie "maison".
Chacun de ces repertoires est doté d'un makefile.
Lorsque je modifie les sources de la librairie, il me faut a la fois
tout recompiler la librairie mais également tous les executables.
Ya certainement un probleme de dependance mais je n'ai pas trouvé ou la
modifier.
Voici les deux makefile pour les intéressés:

1. Pour les executables:

#######################################
BIN = /nfs/data2/arslan/demo_cesbio/bin/

LIB_PERSO = -L/adresselib
INC_PERSO = -I$(HOME)/common/include/greg -I../libstats -I../btoolbox
-I$(HOME)/common/include

LIB_INRIMAGE = -L/usr/local/inrimage/lib
FLAG_INR = -linrimage -lm
FLAG_GREG = -lgreg
FLAG_BTOOLBOX = -lbToolBox
FLAG_LIBSTATS = -lstats -lrf


CFILES = prog1.c \
prog2.c \
....

EOBJS = prog1.o \
prog2.o \
....


PROGS = prog1 \
prog2 \
...


INC = -I/usr/local/inrimage/include $(INC_PERSO) -I.

LIB = $(LIB_PERSO) $(LIB_INRIMAGE) $(FLAG_LIBSTATS) $(FLAG_BTOOLBOX)
$(FLAG_INR) $(FLAG_GREG)

CFLAGS = -Wall -O2 -g $(INC)
LIBS = $(LIB)
CC = gcc

all : $(PROGS)

prog1 : prog1.o
$(CC) $< -o $@ $(LIB)
prog2 : prog2.o
$(CC) $< -o $@ $(LIB)

etc...

install: $(PROGS)
cp $(PROGS) $(BIN)

clean :
rm -f $(COBJS) $(EOBJS) *~
##################################"

2. Pour la librairie:

################################
DEST = adresse de destination de la librairie libstats
LIB_INRIMAGE = -L/usr/local/inrimage/lib

FLAG_INR = -linrimage -lm -lrf
FLAG_GREG = -lgreg
FLAG_BTOOLBOX = -lbToolBox
FLAG_LIBSTATS = -lstats

LIB_PERSO = -L$(DEST)/lib -L$(HOME)/common/lib
INC_PERSO = -I$(HOME)/common/include/greg -I. -I../btoolbox
-I$(HOME)/common/include

CFILES = prog3.c \
prog4.c \
....


COBJS = prog3.o \
prog4.o \
....

INC = -I/usr/local/inrimage/include $(INC_PERSO) -I.

LIB = $(LIB_PERSO) $(LIB_INRIMAGE) $(FLAG_LIBSTATS) $(FLAG_BTOOLBOX)
$(FLAG_INR) $(FLAG_GREG)

.c.o:; gcc -Wall -O2 -g $(INC) -c $*.c ;

all : libstats.a

libstats.a: $(COBJS)
rm -f libstats.a
ar r libstats.a $(COBJS)
ranlib libstats.a
cp libstats.a $(DEST)/lib/libstats.a

clean :
rm -f $(COBJS) $(EOBJS) *~

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

Merci du coup de main.

6 réponses

Avatar
Emmanuel Fleury
Emmanuel Fleury wrote:

Comment génères-tu tes .o ? Est-ce que le Makefile détermines cela
automatiquement ? (et si c'est le cas, il doit inclure les bibliothèques
statiques dans les dépendances par excès de zèle).


Je voulais dire: Comment génères-tu tes .o dans le premier Makefile.

Désolé ! :-/

Amicalement
--
Emmanuel Fleury | Office: 211
Associate Professor, | Phone: +33 (0)5 40 00 35 24
LaBRI, Domaine Universitaire | Fax: +33 (0)5 40 00 66 69
351, Cours de la Libération | email:
33405 Talence Cedex, France | URL: http://www.labri.fr/~fleury

Avatar
Zulfukar Arslan
Emmanuel Fleury wrote:
Emmanuel Fleury wrote:

Comment génères-tu tes .o ? Est-ce que le Makefile détermines cela
automatiquement ? (et si c'est le cas, il doit inclure les bibliothèques
statiques dans les dépendances par excès de zèle).



Je voulais dire: Comment génères-tu tes .o dans le premier Makefile.


Bonne question. Je n'en ai aucune idée.
A vrai dire, ce makefile était déja écris.

La librairie contient un certain nombre de fichiers source (écris en C).
le makefile correspondant a l'air
de construire les ".o" à l'aide de la ligne:

.c.o:; gcc -Wall -O2 -g $(INC) -c $*.c ;

L'autre repertoire contient les executables (aussi ecris en C). Et la,
par contre, je ne vois pas comment il fabrique les ".o".

Si je modifie le source d'un des excutables, je suis obligé de
recompiler la librairie, et ensuite seulement je compile le repertoire
d'executables,
en tapant à la suite (d'abord dans le REP librairie):

make clean && make
cd ../REP_EXE/
make clean && make install

C'est donc assez fastidieux. Mais ça a le mérite de marcher.

Une idée?


Désolé ! :-/

Amicalement



Avatar
Emmanuel Fleury
Zulfukar Arslan wrote:

Une idée?


Essaye de rajouter ces règles génériques:

# Generic rules
%.o: %.c %.d
$(CC) $(CFLAGS) $(INCLUDES) $(LIBFLAGS) -c $<

%.d: %.c
$(CC) -MM $(INCLUDES) $< > $@

%.a: $(LIBOBJS)
$(AR) rcs $@.$(VERSION) $^
@$(LN) $@.$(VERSION) $@

%.so: $(LIBOBJS)
$(CC) $(CFLAGS) -shared -fPIC -ldl -o $@.$(VERSION) $^
@$(LN) $@.$(VERSION) $@


Et de mettre à la fin de ton Makefile la ligne suivante:

# Dependencies
-include $(DEPS)

Amicalement
--
Emmanuel Fleury | Office: 211
Associate Professor, | Phone: +33 (0)5 40 00 35 24
LaBRI, Domaine Universitaire | Fax: +33 (0)5 40 00 66 69
351, Cours de la Libération | email:
33405 Talence Cedex, France | URL: http://www.labri.fr/~fleury

Avatar
Zulfukar Arslan
Emmanuel Fleury wrote:
Zulfukar Arslan wrote:

Une idée?



Essaye de rajouter ces règles génériques:


Dans le makefile de la lib? et a quel endroit?



# Generic rules
%.o: %.c %.d
$(CC) $(CFLAGS) $(INCLUDES) $(LIBFLAGS) -c $<

%.d: %.c
$(CC) -MM $(INCLUDES) $< > $@

%.a: $(LIBOBJS)
$(AR) rcs $@.$(VERSION) $^
@$(LN) $@.$(VERSION) $@

%.so: $(LIBOBJS)
$(CC) $(CFLAGS) -shared -fPIC -ldl -o $@.$(VERSION) $^
@$(LN) $@.$(VERSION) $@


Et de mettre à la fin de ton Makefile la ligne suivante:

# Dependencies
-include $(DEPS)

Amicalement



Avatar
Emmanuel Fleury
Zulfukar Arslan wrote:

Dans le makefile de la lib? et a quel endroit?


Dans le Makefile qui construit les binaires (pas les bibliothèques).

Amicalement
--
Emmanuel Fleury | Office: 211
Associate Professor, | Phone: +33 (0)5 40 00 35 24
LaBRI, Domaine Universitaire | Fax: +33 (0)5 40 00 66 69
351, Cours de la Libération | email:
33405 Talence Cedex, France | URL: http://www.labri.fr/~fleury

Avatar
Zulfukar Arslan
Emmanuel Fleury wrote:
Zulfukar Arslan wrote:

Dans le makefile de la lib? et a quel endroit?



Dans le Makefile qui construit les binaires (pas les bibliothèques).

Amicalement


J'ai que des "undefined reference to ...". Il a pas l'air de
reconnaitre les librairies...