(.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 im LDFLAGS. 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 und consumer.o: shared.h yet_another_header.h etc.
  • Ein paar andere Vorschläge: Verwenden Sie $(MAKE) statt nur make 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 auch CFLAGS für C (statt CCFLAGS 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, lassen make 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
InformationsquelleAutor user2644819 | 2013-12-11
Schreibe einen Kommentar