Makefile-Fehler : Befehl Nicht Gefunden - beim erstellen einer shared library
Ich habe 4 .c-Dateien hello.c
,here.c
,bye.c
und main.c
.
Eine header-Datei mylib.h
Die Inhalte sind wie folgt
Hallo.c
#include<stdio.h>
void hello()
{
printf("Hello!\n");
}
hier.c
#include<stdio.h>
void here()
{
printf("I am here \n");
}
bye.c
#include<stdio.h>
void bye()
{
printf("Bye,Bye");
}
main.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
Makefile erstellen Sie eine statische lib ist :
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
Problem: Wenn ich den Befehl ausführen
make -f Makefile all
Bekomme ich die Fehlermeldung:
gcc-Wall -fPIC -c -o hello.o Hallo.c
make: gcc: Kommando nicht gefunden
Hersteller: * [Hallo.o] Fehler 127
Fragen : How do I resolve this?
- Sind Sie sicher, dass Sie die Datei main.c im gleichen Verzeichnis, in dem Sie den make-Befehl?
- ja, sehr viel.
- Vielen Dank für den aufschlussreichen Kommentar. Ich glaube irgendwo das wichtigste.c-Datei gelöscht worden war. Ich habe jetzt geschrieben einen neuen main.c und in den Ordner geschoben. Aber jetzt bekomme ich 'gcc-Wall -fPIC -c -o hello.o Hallo.c make: gcc: Kommando nicht gefunden make: *** [hello.o] Fehler 127'
- Jede chance, die Sie buchen können debug-make Ausgabe?
- Das ist, weil Sie den Wert von PATH im Makefile. Die Schale ist nicht in der Lage zu finden, gcc, weil die. Versuchen Sie das umbenennen der variable PATH im Makefile um, sagen wir, LIBPATH (in allen Orten).
- Danke, no way, dass ich, dass herausgefunden haben. Jetzt bekomme ich die Fehler - /usr/bin/ld:
cannot find -lmylib collect2: ld returned 1 exit status make: *** [main] Error 1
Nicht sicher, warum der linker ist nicht in der Lage, die Datei zu finden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
+++++
OK. Ermöglicht das wiederherstellen Ihrer original-code, aber mit einem kleinen Unterschied.
Ändern DYNLINKFLAGS zurück zu:
Dann ändern Sie den library-link zu:
Tun "rm -f lib*", "build" und dann post machen Ausgabe.
Gibt es ein paar bugs (nur Tippfehler), die ich sehen kann, ist:
Raum zwischen
-
undWall
:PORG_OBJS
solltePROG_OBJS
Du machst eine absolute Zuordnung zu
PATH
. Nun jede ausführbare Datei namens in der Datei makefile wird die Suche in diesem Verzeichnis. Dagcc
ist, die nicht in diesem Verzeichnis erhalten Sie diese Fehlermeldung. Um dies zu beheben, können Sie entweder ein verschiedenen Variablen-Namen oder fügen Sie Ihrem Verzeichnis zu aktuellen Pfad als:Ändern Sie diese Zeile aus:
zu:
Dem-L-flag muss vor dem -l-flags.
libmylib.so.0 -> libmylib.so libmylib.so -> libmylib.so.0.1 libmylib.so.0.1 -> libmylib.so.0.1.0
OK. Erste änderung:
zu
Dann ändern:
Zu:
Dann post von der Bibliothek links und die endgültige ausführbare link.