2013-07-14 6 views
0

Je suis nouveau sur makefile. Je ne suis pas sûr pourquoi l'exécutable 'principal' n'apparaît pas après la compilation. Le code compile très bien, mais le compilateur dit:Makefile - ne pas sortir l'exécutable

-lm: linker input file unused because linking not done 

-ltiff: linker input file unused because linking not done 

Ci-dessous le code makefile:

INCLUDES = -I. -I../include -I/opt/local/include 
CC = gcc 
OBJS = image_io.o textfile_io.o main.o 
CFLAGS = $(INCLUDES) -c -g 
DESTDIR = ../bin 
LDFLAGS = -L. -L../lib -L/opt/local/lib -lm 
DEPS = file_io.h corr.h nmsimplex.h matrix.h /opt/local/include/tiffio.h \ 
     /opt/local/include/tiff.h 

image_io.o: image_io.c file_io.h /opt/local/include/tiffio.h \ 
       /opt/local/include/tiff.h 
    $(CC) $(CFLAGS) -o [email protected] $< $(LDFLAGS) -ltiff 

textfile_io.o: textfile_io.c file_io.h 
    $(CC) $(CFLAGS) -o [email protected] $< $(LDFLAGS) 

main.o: main.c file_io.h nmsimplex.h corr.h 
    $(CC) $(CFLAGS) -o [email protected] -fopenmp $< $(LDFLAGS) 

main: $(OBJS) 
    $(CC) -o $(DESTDIR)/[email protected] -fopenmp $^ $(LDFLAGS) 

.PHONY: clean 
clean: 
    rm -f *.o *~ 

Merci

+0

Pourquoi incluez-vous les drapeaux de l'éditeur de liens lorsque vous ne créez pas de liaison, que vous compilez? –

+1

Je crains de ne pas pouvoir. –

+0

vous avez raison. J'étais un peu nouveau pour les termes. mais merci – nineties

Répondre

2

Pourquoi vous obtenez les deux avertissements:

main.o: main.c file_io.h nmsimplex.h corr.h 
    $(CC) $(CFLAGS) -o [email protected] -fopenmp $< $(LDFLAGS) 

Vous compilent pas de liaison, pas besoin de mettre $(LDFLAGS) qui sont des drapeaux de l'éditeur de liens. Ces indicateurs ne sont pertinents que pour la cible main et non pour la cible main.o.

Makefile- pas sortir l'exécutable

Ajouter une cible:

all: main 

juste après DEPS définition. La cible all sera exécutée en premier et exécutera la cible main.

+1

En fait, il y a plus de mal ici. La recette de la cible 'main' ne construit pas' main', elle construit '$ (DESTDIR)/main'. C'est un non-non; cela signifie que chaque fois que vous lancez 'make', cela reliera le programme même si rien n'a changé. Cette règle devrait être modifiée de sorte que la cible soit '$ (DESTDIR)/main', et la première cible devrait être' all: $ (DESTDIR)/main'. – MadScientist