Makefile pour lib partager
Résolu
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
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 :
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.
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.
A voir également:
- Makefile pour lib partager
- Créer un lien pour partager des photos - Guide
- Partager ma position actuelle - Guide
- Partager abonnement - Accueil - Services en ligne
- Partager google photo - Guide
- Partager agenda google android - Guide
4 réponses
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.
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:
et pourquoi pas aussi une règle:
%.o: %.c $(CC) -o $@ -c $< $(CFLAGS)
Spécifies-tu LD_LIBRARY_PATH="." quand tu exécutes ton programme?
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é.
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é.
et ainsi?
CXFLAGS = -L. -lmy_malloc -Wl,-rpath,.
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 !
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.
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 ?