staging.inyokaproject.org

Problem mit makefile (C)

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 20.04 (Focal Fossa)
Antworten |

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Ich habe da gerade ein kleines Problem mit einem makefile. Ich gebe zu, dass ich dafür nicht gerade ein Experte bin. Ich kopiere meistens funktionierende Muster und passe sie an. Hier mal die Ausgabe:

manfred@samurai:~/prog/net/bcd01$ make
gcc -Wall -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -g -c thumb_server.c
...
gcc -Wall -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -g -c make_thumb_name.c
gcc -Wall -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -g -c functions.c
gcc -o thumb_server thumb_server.o make_thumb_name.o functions.o -lglib-2.0
gcc -MM thumb_server make_thumb_name.c functions.c > depend
gcc: warning: thumb_server: linker input file unused because linking not done
make: „thumb_server“ ist bereits aktuell.
manfred@samurai:~/prog/net/bcd01$

Der ausgelassene Anteil betrifft den Beispielcode aus einem Lehrbuch und betrifft Warnungen zu signed und unsigned chars.

Mich irritiert, dass der Linker nicht explizit aufgerufen wird und die Meldung, das der thumb_server bereits aktuell ist. Diese Meldung kommt auch, wenn ich vorher alle *.o Dateien gelöscht hatte.

Daher nehme ich an, dass mein makefile fehlerhaft ist.

# makefile for thumb_server
CC       = gcc
DEBUG    = -g
CFLAGS   = -Wall
CFLAGS   += $(shell pkg-config --cflags glib-2.0)
LDSTATIC += $(shell pkg-config --libs glib-2.0)
LINK     = $(CC)
DEPENDFILE = depend

TARGET = thumb_server

OBJS =  thumb_server.o\
	make_thumb_name.o\
	functions.o

SRCS = thumb_server\
	make_thumb_name.c\
	functions.c

.SUFFIXES: .c .o
%.o: %.c
	$(CC) $(CFLAGS) $(DEBUG) -c $<

$(TARGET): $(OBJS)
	$(LINK) -o $(TARGET) $(OBJS) $(LDSTATIC)

depend: $(SRCS)
	$(CC) -MM $(SRCS) > $(DEPENDFILE)
-include $(DEPENDFILE)

Funktionieren tut das erzeugte Programm aber. Die angesprochenen Funktionen aus den anderen Dateien werden definitiv ausgeführt, was ich an den Ergebnissen und den eingebauten Debug-Ausgaben erkennen kann. Und make_thumb_name.c ist ein Code, den ich schon seit ca. 9 Monaten in zwei anderen Programmen einsetze.

Was habe ich falsch gemacht?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Ich denke, der Linker wird das erste Mal in dieser Zeile aufgerufen:

gcc -o thumb_server thumb_server.o make_thumb_name.o functions.o -lglib-2.0

Damit bekommst Du Dein Executable. Danach (warum eigentlich danach?) werden Regeln für die Abhängigkeit generiert

gcc -MM thumb_server make_thumb_name.c functions.c > depend

Das sieht aus, als ob da ".c" bei "thumb_server" fehlt.

Im Zweifel man make mit Debugflag ausführen, damit Du siehst, was er da so treibt.

Dakuan

(Themenstarter)
Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Das sieht aus, als ob da ".c" bei "thumb_server" fehlt.

Danke, das war's. Aber hätte da nicht eine Warnung kommen dürfen?

Danach (warum eigentlich danach?) werden Regeln für die Abhängigkeit generiert

Keine Ahnung. Das habe ich so von einer Projektseite übernommen und mein Buch über Linux Programmierung geht darauf nicht näher ein.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Dakuan schrieb:

Das sieht aus, als ob da ".c" bei "thumb_server" fehlt.

Danke, das war's. Aber hätte da nicht eine Warnung kommen dürfen?

???

gcc: warning: thumb_server: linker input file unused because linking not done

Und jetzt frag nicht nach Warnungen, die Deine Gedanken lesen können und genau den Fehler melden, den Du gemacht hast. 😉

Danach (warum eigentlich danach?) werden Regeln für die Abhängigkeit generiert

Keine Ahnung. Das habe ich so von einer Projektseite übernommen und mein Buch über Linux Programmierung geht darauf nicht näher ein.

Ich würde das mal nach oben ziehen, vor die Kompilierung sogar. Also die letzten drei Zeilen hinter SUFFIXES. Wenn es da nicht geht, nach unten schieben. Du willst ja idealerweise vor dem Compilieren die Abhängigkeiten klar haben, damit die Dateien neu kompiliert werden, die mindestens eine Abhängigkeit haben, die seit dem letzten Bauen aktualisiert wurde.

Dakuan

(Themenstarter)
Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

???

gcc: warning: thumb_server: linker input file unused because linking not done

Da war noch ein anderer Fehler, der sehr peinlich ist. Ich hatte in der Hauptdatei anstatt functions.h leider functions.c per #include eingebunden. Da ist dann klar, dass da nichts zum Linken ist, zumal die Funktionen in make_thumb_name.c zu dem Zeitpunkt noch nicht angefordert wurden.

Aber ich denke mal, dass make die Namen einfach nur weiter reicht. Da hätte sich dann wohl bestenfalls nur gcc beschweren können.

Die anderen Punkte werde ich bei den nächsten Änderungen mal ausprobieren. Meine Ausgangsbasis stammt übrigens von hier. Da ich davon ausgegangen bin, das diese Jungs wissen was sie da machen, habe ich daran nur die nötigsten Veränderungen vorgenommen und hoffentlich keine Fehler eingebaut.

Ich bin mir da nicht sicher, aber die Beschreibung in dem uralten Buch "Linux-UNIX-Programmierung" lässt vermuten, dass die Make-Datei mehrfach abgearbeitet wird (steht aber explizit nicht so da).

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Dakuan schrieb:

Ich bin mir da nicht sicher, aber die Beschreibung in dem uralten Buch "Linux-UNIX-Programmierung" lässt vermuten, dass die Make-Datei mehrfach abgearbeitet wird (steht aber explizit nicht so da).

Ja, vielleicht hast Du Recht. Mein make fu ist etwas angerostet.

Antworten |