(.text+0x20): undefined reference to `main' und undefined reference to function
Ich habe ein Problem, immer mein makefile zu arbeiten, ohne Fehler. Die erste Frage, die ich habe, ist mit einer undefined reference to main. Ich habe die wichtigsten in meinem Produzenten.c-Datei eine Funktion. Das zweite Problem ist ein undefined reference to SearchCustomer().
Fehler:
bash-4.1$ make
gcc -Wall -c producer.c shared.h
gcc -Wall -c consumer.c shared.h
gcc -Wall -c AddRemove.c shared.h
gcc -pthread -Wall -o producer.o consumer.o AddRemove.o
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
AddRemove.o: In function `AddRemove':
AddRemove.c:(.text+0xb1): undefined reference to `SearchCustomer'
AddRemove.c:(.text+0x1e9): undefined reference to `SearchCustomer'
AddRemove.c:(.text+0x351): undefined reference to `SearchCustomer'
collect2: ld returned 1 exit status
make: *** [producer] Error 1
makefile:
COMPILER = gcc
CCFLAGS = -Wall
all: main
debug:
make DEBUG=TRUE
main: producer.o consumer.o AddRemove.o
$(COMPILER) -pthread $(CCFLAGS) -o producer.o consumer.o AddRemove.o
producer.o: producer.c shared.h
$(COMPILER) $(CCFLAGS) -c producer.c shared.h
consumer.o: consumer.c shared.h
$(COMPILER) $(CCFLAGS) -c consumer.c shared.h
AddRemove.o: AddRemove.c shared.h
$(COMPILER) $(CCFLAGS) -c AddRemove.c shared.h
ifeq ($(DEBUG), TRUE)
CCFLAGS += -g
endif
clean:
rm -f *.o
- Der code ist auch lang. Grenzen Sie Ihre problem und sorgen für eine Kurze, eigenständig, Korrekt (Kompilierbare), Beispiel.
- Ein paar Vorschläge: in der
main
Rezept, können Sie schreiben:$(COMPILER) -o $@ $^ $(LDFLAGS)
und setzen-pthread
imLDFLAGS
. In den anderen Regeln, die Sie schreiben können einmal:%.o: %.c
und als Rezept:$(COMPILER) $(CCFLAGS) -c -o $@ $<
(und nicht geben die.h
an den compiler!) und später hinzufügen Abhängigkeit für spezielle Ziele, zum Beispiel:producer.o: shared.h other_header.h
undconsumer.o: shared.h yet_another_header.h
etc. - Ein paar andere Vorschläge: Verwenden Sie
$(MAKE)
statt nurmake
zu halten, die Kommandozeilen-flags, die für die aufgerufen wird, zu machen. Möglicherweise möchten Sie auch zu geben--no-print-directory
um zu verhindern, dass einige Linien von nutzlos ausgegeben. Nutzen Sie auchCFLAGS
für C (stattCCFLAGS
die verwechselt werden könnten, für C++). - Und noch mehr: Fügen Sie
.PHONY: all clean debug
und andere Ziele, die nicht eigentlich Dateien, lassenmake
wissen, dass Sie sollten nicht erwarten, dass eine tatsächliche Datei aus dem Rezept. Sie können auch@$(MAKE) DEBUG=TRUE
(hinzufügen@
) um zu verhindern, dass aus echo der Befehl. - Und schließlich können Sie profitieren von die Gebrauchsanweisung zu Lesen: gnu.org/software/make/manual/make.html
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Regel
ist falsch. Es sagt, um erstellen Sie eine Datei namens Produzent.o, aber Sie möchten, erstellen Sie eine Datei namens
main
. Bitte entschuldigt das Schreien, aber VERWENDEN Sie IMMER $@ REFERENZ DAS ZIEL:$^
zu finden, um alle Abhängigkeiten es.Dieser Fehler bedeutet, dass, während die Verknüpfung, der compiler ist nicht in der Lage zu finden, die definition von
main()
- Funktion überall.Im makefile, die
main
Regel zu erweitern, so etwas wie dieses.Als pro die
gcc
Handbuch Seite, die Verwendung von-o
- Schalter, wie untenEs bedeutet, gcc wird die Ausgabe in die mit dem Namen versehen sofort weiter zu
-o
wechseln. So, hier statt der Verknüpfung alle.o
Dateien zusammen und erstellen die binäre [main
, in Ihrem Fall ist], dessen Schaffung der binären alsproducer.o
Verbindung der anderen.o
- Dateien. Bitte korrigieren Sie das.