Das Hauptproblem ist, dass Sie nirgends sind explizit sagen, was Ihre Quelldateien sind. Beginnen Sie, indem Sie das:
SOURCEDIR=/home/test/project/sources
SOURCES=$(wildcard $(SOURCEDIR)/*.c)
Dann die Objektdateinamen aus den Quelldateinamen durch Substitution .c
für .o
ableiten:
OBJECTDIR=/home/test/project/objects
OBJECTS=$(patsubst $(SOURCEDIR)/%.c,$(OBJECTDIR)/%.o,$(SOURCES))
Sie können immer noch halten Sie Ihre allgemeine Regel zu bauen Objektdateien:
$(OBJECTDIR)/%.o: $(SOURCEDIR)/%.c
$(CC) -fPIC -c $^ -o [email protected]
Aber Sie geben die explizite Liste von Objektdateien von der Regel sharedlib
zu machen:
libsharedlib.so: $(OBJECTS)
$(CC) -shared -o [email protected] $<
Beachten Sie, dass ich den Namen der Regel identisch mit der Datei gemacht habe, die generiert wird. Das ist wichtig, denn das zweimalige Aufrufen von make wird dann das Erstellen der Bibliothek ein zweites Mal überspringen. Sie können jederzeit einen Aliasnamen hinzufügen, wenn Sie wollen:
sharedlib: libsharedlib.so
In diesem Fall ist es auch gut machen zu sagen, dass sharedlib
ist keine echte Datei:
.PHONY sharedlib
Dies verhindert, dass seltsame Dinge passiert, wenn Sie jemals hatte eine Datei namens sharedlib
im Verzeichnis.
Aber Wildcard würde bedeuten, dass ich alle Dateien auf einmal zu kompilieren? – Bionix1441
Ich habe es geändert, aber immer noch das gleiche Problem. – Bionix1441
Versuchen Sie, libsharedlib.so mit allen Objekten gleichzeitig zu kompilieren? – 2501