2016-09-21 1 views
0

Voici mon makefile:Pourquoi ai-je l'erreur, "référence non définie à` pow 'collect2: erreur: ld a renvoyé 1 statut de sortie make: *** [p1] Erreur 1 "?

CC=gcc 

CFLAGS=-g 

LDFLAGS=-lm 

EXECS= p1 


all: $(EXECS) 

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

14:32:16 **** Construire la configuration par défaut pour le projet CH3- programmes **** faire p1 gcc -g -ggdb -lm p1.c -o p1 /tmp/ccNTyUSA.o: en fonction main': /home/bm5788/fromVM/Workspace/CH3-Programs//p1.c:28: undefined reference to Pow » collect2: erreur: ld retourné 1 état de sortie make: *** [p1] erreur 1 : recette pour cible 'p1' a échoué

+0

Et le makefile construira l'exécutable 'p1' à partir de quels fichiers objets? Et s'il vous plaît poster la sortie de l'exécution de la commande 'make' (après' make clean'). –

+0

Utilisez-vous la fonction Pow dans votre code? – Angen

+0

Oui, j'ai utilisé pow dans mon code. –

Répondre

2

Le problème ici est l'ordre que vous liez avec la bibliothèque mathématique (l'option -lm). Les bibliothèques doivent être après les sources ou les fichiers objet sur la ligne de commande lors de la construction.

Donc, si vous avez exécuté la commande pour construire manuellement, il devrait ressembler à

gcc p1.c -o p1 -lm 

Le problème est que votre makefile ne fait pas vraiment quoi que ce soit, et il vit sur implicites seules règles. Les règles implicites utilisent certaines variables dans un certain ordre qui ne placent pas la bibliothèque dans la bonne position dans votre fichier makefile.

Essayez plutôt quelque chose comme ça makefile:

# 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) 

Si vous exécutez make en utilisant le makefile ci-dessus, le programme make doit d'abord construire le fichier objet p1.o à partir du fichier source p1.c. Ensuite, vous devez utiliser le fichier objet p1.o pour lier l'exécutable p1 avec la bibliothèque mathématique standard.

+0

Oui !! Ça a marché! Merci beaucoup. Je ne peux pas vous remercier assez. –

+1

@BryceMarshall Vous pouvez remercier le répondant plus efficacement en upvoting et en acceptant sa réponse :-) – njuffa