Makefile pour lib partager

Résolu/Fermé
Utilisateur anonyme - Modifié par astrocurieux le 27/01/2017 à 17:43
 Utilisateur anonyme - 29 janv. 2017 à 12:08
Bonjour tout le monde.

j'ai crée un chouette Makefile qui compile et qui crée une lib partager (.so) ainsi que un exécutable

mais pas moyen d’exécuté mon exécutable ....
mon .so est crée, mon exécutable aussi, est pourtant lors de son exécution je recoit ce msg d'erreur :

./Prog: error while loading shared libraries: libcollam.so: cannot open shared object file: No such file or directory

internet n'a pas d'explication très utile a me fournir, je m'adresse donc a vous ...

j'ai include le .h de ma lib dans mon main()
je n'utilise AUCUNE fonction de ma lib dans mon main (pour le teste) et pourtant ca ne fonctionne pas ...

voici le Makefile :

LIB				= libcollam.so

NAME			= Prog

CC				= gcc

RM				= rm -f

SRCL			= src/Utils.c		\
				    src/Tools.c				\
				    src/Tool.c

SRCN			= src/main.c \

OBJL			= $(SRCL:.c=.o)

OBJN			= $(SRCN:.c=.o)

CFLAGS		+= -c -fPIC
CFLAGS		+= -W -Wall -Wextra -Werror
CXFLAGS		=  -L. -lmy_malloc

$(LIB)		: $(OBJL)
		  $(CC) $(CFLAGS) $(SRCL)
		  $(CC) -shared $(OBJL) -o $(LIB)

$(NAME)		: $(OBJN)
		  $(CC) $(OBJN) $(CXFLAGS) -o $(NAME)

all				: $(LIB) $(NAME)

clean			:
		  $(RM) $(OBJL)
		  $(RM) $(OBJN)

fclean		: clean
		  $(RM) $(LIB)
		  $(RM) $(NAME)

re		: fclean all

.PHONY		: all clean fclean re



j'en profite pour vous demander également pourquoi quand je lance "Make" il ne compile que ma lib et pas mon Prog ... je doit obligatoirement lancer "Make all" pour avoir les deux .

j'attend avec impatience votre aide.
merci d'avoir supporter mon orthographe jusqu'ici.

4 réponses

yg_be Messages postés 22697 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
28 janv. 2017 à 13:58
bonjour, je pense que quand tu appelles "make", il ne s'occupe que de la première cible: donc il te suffit de mettre la règle avec la cible "all" comme première règle.
0
Utilisateur anonyme
28 janv. 2017 à 16:02
si je fait cela je peut plus demander une compilation d'un seul exécutable ...
il me compilera a chaque fois la lib + le programme, hors je veut qu'il soit en mesure de me laisser le choix d'ou la règle All ...

merci de ta réponse yg_be, je reste a l'ecoute si tu a d'autre idée, je continue de chercher de mon coté.
Bon weekend !
0
yg_be Messages postés 22697 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
Modifié par yg_be le 28/01/2017 à 16:34
je ne vois pas ce qui t’empêche de demander une seule compilation après avoir mis "all" au début.
si tu ne spécifie rien, il s'occupe de la première cible, donc uniquement de la librairie.
normalement make recompile uniquement si une dépendance a changé: si il recompile la librairie à chaque fois, même si les sources n'ont pas changé, tu as un problème avec ton chouette fichier.
0
Utilisateur anonyme
28 janv. 2017 à 17:03
Ha oui d'accord ... j'avait mal compris, et effectivement tu as raison a ce niveau !

j'ai remonter mon 'all' et ça marche bien mieux.
j'ignorer totalement que la position d'une règle dans un Makefile donner une certaine 'priorité' , je suis heureux de l'avoir appris, ça va bien me servir par la suite.

j'ai donc un Makefile qui me compile tout avec un simple 'Make' a présent.
merci yg_be.

aurais tu également une petite idée de pourquoi j’obtiens mon erreur cité plus haut ?
je crois que cela doit provenir de mon LD_PRELOAD ou peut etre de LD_LIBRARY_PATH ? étant donner que je ne les utilises pas cela doit influencer non ?
0
yg_be Messages postés 22697 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
Modifié par yg_be le 28/01/2017 à 16:57
je pense que tu devrais avoir une règle qui indique le .h de ta lib comme une dépendance de main.o.
et pourquoi pas aussi une règle:
%.o: %.c
     $(CC) -o $@ -c $< $(CFLAGS)
0
yg_be Messages postés 22697 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
28 janv. 2017 à 17:12
Spécifies-tu LD_LIBRARY_PATH="." quand tu exécutes ton programme?
0
Utilisateur anonyme
28 janv. 2017 à 17:27
je ne fait qu'un 'make' lors de la compilation, rien de plus.
et j’exécute directement mon exécutable sans ajout sur la ligne de commande.

je pensais que mon FLAG '-L.' remplacer justement la ligne de commande LD_LIBRARY_PATH .... autrement non je ne le fait pas ...

je ne comprend pas bien ce que fait ta règle dans ton avant dernier message.

merci de ta réactivité.
0
yg_be Messages postés 22697 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
28 janv. 2017 à 19:31
qu'est-ce que cela donne avec LD_LIBRARY_PATH="." quand tu exécutes ton programme?
0
Utilisateur anonyme
28 janv. 2017 à 19:58
aucun changement apparent ...
toujours la même erreur .
0
yg_be Messages postés 22697 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
28 janv. 2017 à 19:37
et ainsi?
CXFLAGS		=  -L. -lmy_malloc -Wl,-rpath,.
0
Utilisateur anonyme
28 janv. 2017 à 20:02
waouw, ça fonctionne super !!!

plus aucune erreur a l'horizon !
merci beaucoup yg_be, tu m’enlève une grosse épine du pied !
mais a quoi corresponde ses deux flags ?
0
yg_be Messages postés 22697 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
28 janv. 2017 à 20:11
le premier flag, Wl, indique au compilateur que le l'option est un paramètre pour le loader, et le rpath indique où le programme devra aller chercher les librairies à l’exécution.
sans ces options, le programme va chercher les librairies à un endroit commun pour tous les programmes.
0
Utilisateur anonyme
29 janv. 2017 à 12:08
c'est compris, merci encore!
bonne fin de weekend !
0