2016-09-21 5 views
0

Hier ist meine Make-Datei:Warum bekomme ich den Fehler, "undefinierter Verweis auf` pow 'collect2: Fehler: ld zurückgegeben 1 Exit-Status make: *** [p1] Error 1 "?

CC=gcc 

CFLAGS=-g 

LDFLAGS=-lm 

EXECS= p1 


all: $(EXECS) 

clean: 
    rm -f *.o $(EXECS) 

14:32:16 **** Erstellen von Konfigurations Standard für Projekt CH3-Programme **** make p1 gcc -g -ggdb -Im p1.c -o p1 /tmp/ccNTyUSA.o: In Funktion pow main': /home/bm5788/fromVM/Workspace/CH3-Programs//p1.c:28: undefined reference to‘ collect2: Fehler: ld ergab 1 Exit-Status make: *** [p1] Fehler 1: Rezept für target 'p1' failed

+0

Und das Makefile wird die ausführbare 'p1' von welchen Objektdateien erstellen? Und posten Sie bitte die Ausgabe, indem Sie den 'make' Befehl ausführen (nach' make clean'). –

+0

Verwenden Sie die Pow-Funktion in Ihrem Code? – Angen

+0

Ja, ich habe pow in meinem Code verwendet. –

Antwort

2

Das Problem ist hier die Reihenfolge, die Sie mit der Mathematikbibliothek verknüpfen (-lm Option). Bibliotheken sollten beim Erstellen nach den Quellen oder Objektdateien in der Befehlszeile sein.

Also, wenn Sie den Befehl lief manuell zu bauen, sollte es aussehen

gcc p1.c -o p1 -lm 

Das Problem ist, dass Ihr Make-Datei nicht wirklich etwas zu tun hat, und es lebt auf implizite Regeln allein. Die impliziten Regeln verwenden bestimmte Variablen in einer bestimmten Reihenfolge, die die Bibliothek nicht in der richtigen Position in Ihrem Makefile platzieren.

Versuchen Sie stattdessen so etwas wie diese Make-Datei:

# The C compiler to use. 
CC = gcc 

# The C compiler flags to use. 
# The -g flag is for adding debug information. 
# The -Wall flag is to enable more warnings from the compiler 
CFLAGS = -g -Wall 

# The linker flags to use, none is okay. 
LDFLAGS = 

# The libraries to link with. 
LDLIBS = -lm 

# Define the name of the executable you want to build. 
EXEC = p1 

# List the object files needed to create the executable above. 
OBJECTS = p1.o 

# Since this is the first rule, it's also the default rule to make 
# when no target is specified. It depends only on the executable 
# being built. 
all: $(EXEC) 

# This rule tells make that the executable being built depends on 
# certain object files. This will link using $(LDFLAGS) and $(LDLIBS). 
$(EXEC): $(OBJECTS) 

# No rule needed for the object files. The implicit rules used 
# make together with the variable defined above will make sure 
# they are built with the expected flags. 

# Target to clean up. Removes the executable and object files. 
# This target is not really necessary but is common, and can be 
# useful if special handling is needed or there are many targets 
# to clean up. 
clean: 
    -rm -f *.o $(EXEC) 

Wenn Sie make unter Verwendung der oben Make-Datei ausführen, sollte das make Programm zuerst p1.o aus der Quelldatei p1.c die Objektdatei erstellen. Dann sollte die p1.o Objektdatei verwenden, um die ausführbare Datei p1 zusammen mit der Standard-Math-Bibliothek zu verknüpfen.

+0

Ja !! Es funktionierte! Vielen Dank. Ich kann dir nicht genug danken. –

+1

@BryceMarshall Sie können dem Beantworter effektiver danken, indem Sie seine Antwort aufheben und akzeptieren :-) – njuffa

Verwandte Themen