Makefile Erreur : Commande introuvable - lors de la création d'une bibliothèque partagée
J'ai 4 .c fichiers hello.c
,here.c
,bye.c
et main.c
.
Un fichier d'en-tête mylib.h
Le contenu sont comme suit
bonjour.c
#include<stdio.h>
void hello()
{
printf("Hello!\n");
}
ici.c
#include<stdio.h>
void here()
{
printf("I am here \n");
}
bye.c
#include<stdio.h>
void bye()
{
printf("Bye,Bye");
}
principal.c
#include<stdio.h>
#include "mylib.h"
int main()
{
hello();
here();
bye();
return 1;
}
mylib.h
#ifndef _mylib_
#define _mylib_
void hello();
void here();
void bye();
#endif
Le makefile pour la création d'une lib statique est :
Makefile
#Which Compiler
CC = gcc
#Compiler Flags
CFLAGS = - Wall -c -fPIC
DYNLINKFLAGS = -shared -W1,-soname,$@.0
PROG = main
PROG_OBJS = main.c
LIB = mylib
LIB_FILES = libmylib.so
LIB_MINOR = $(LIB_FILES).0.1
LIB_RELEASE = $(LIB_MINOR).0
LIB_OBJS = hello.o here.o bye.o
PATH = /home/srinivasa/cspp51081/labs/srinivasa.lab2.1
all: $(LIB_FILES) $(PROG)
#Create Lib with this file
$(LIB_FILES): $(LIB_OBJS)
$(CC) $(DYNLINKFLAGS) $^
ln -sf $(LIB_RELEASE) $(LIB_MINOR)
ln -sf $(LIB_MINOR) $@
ln -sf $@ $@.0
#Compiling main program and link with shared library
$(PROG): $(PROG_OBJS)
$(CC) -o $(PROG) $(PORG_OBJS) -l$(LIB) -L$(PATH)
main.o: main.c
hello.o: hello.c
here.o: here.c
bye.o: bye.c
#clean files
clean:
rm -rf $(LIB_OBJS) $(LIB_FILES) $(LIB_RELEASE) $(LIB_MINOR) libmylib.so.0
Problème: Lorsque j'exécute la commande
make -f Makefile all
J'obtiens l'erreur:
gcc -Wall-fPIC-c -o bonjour.o bonjour.c
marque: gcc: Command not found
marque: * [bonjour.o] Erreur 127
Questions : How do I resolve this?
- Êtes-vous sûr que vous avez le fichier principal.c dans le même répertoire où vous exécutez la commande make?
- ouais très bien.
- Merci pour le commentaire pénétrant. Je crois que quelque part le principal.c fichier a été supprimé. J'ai maintenant écrit un nouveau principal.c et mis dans le dossier. Cependant maintenant j'ai 'gcc -Wall-fPIC-c -o bonjour.o bonjour.c faire: gcc: Commande introuvable faire: *** [bonjour.o] Erreur 127'
- Toute chance vous pouvez poster de débogage de faire une sortie?
- C'est parce que vous êtes à la définition de la valeur de CHEMIN dans votre Makefile. La coquille est pas en mesure de trouver la gcc à cause de cela. Essayez de renommer la variable PATH dans le fichier Makefile pour, disons, LIBPATH (dans tous les endroits).
- Merci, pas moyen que je l'aurais compris. Maintenant, je reçois l'erreur - /usr/bin/ld:
cannot find -lmylib collect2: ld returned 1 exit status make: *** [main] Error 1
ne savons Pas pourquoi l'éditeur de liens n'est pas en mesure de trouver le fichier.
Vous devez vous connecter pour publier un commentaire.
+++++
OK. Permet de revenir à votre code d'origine, mais avec une petite différence.
Changement DYNLINKFLAGS retour à:
Puis changer le lien de la bibliothèque pour:
Faire "rm-f lib*", construire et puis après faire une sortie.
Il y a quelques bugs (juste des fautes de frappe) je peux voir, c'est:
espace entre
-
etWall
:PORG_OBJS
devrait êtrePROG_OBJS
Vous faites une cession absolue de
PATH
. Maintenant, chaque exécutable appelé dans le makefile sera la recherche dans ce répertoire. Depuisgcc
n'est trouvé dans ce répertoire, vous obtenez cette erreur. Pour résoudre ce problème, vous pouvez utiliser un différents nom de la variable ou de l'ajouter à votre répertoire au chemin que:Essayez de changer cette ligne à partir de:
à:
L'option-L doit précéder l'-l drapeaux.
libmylib.so.0 -> libmylib.so libmylib.so -> libmylib.so.0.1 libmylib.so.0.1 -> libmylib.so.0.1.0
OK. Premier changement:
à
Puis changement:
À:
Puis après la bibliothèque de liens et l'exécutable final lien.