2013-11-19 5 views
0

Когда я выполняю этот Makefile без очистки, он работает нормально, и как общая библиотека, так и основной исполняемый файл создаются правильно. Однако, когда я добавляю чистую цель, «make all» терпит неудачу. Что может быть причиной?«make clean» причины «make all» failure

CC = gcc 
CFLAGS = -fPIC -Wall -Werror 
LDFLAGS = -shared 

TARGET_LIB= libnsd.so 

lib: nsd.o nd.o 
    $(CC) $(LDFLAGS) -o ${TARGET_LIB} nsd.o nd.o -lm 

nd.o : nd.c nd.h 
    $(CC) -c $(CFLAGS) nd.c 

nsd.o : nsd.c nsd.h 
    $(CC) -c $(CFLAGS) nsd.c 

all: main.c 
    $(CC) -o -I. -L. main.c -lnsd 

clean: 
    rm -f libnsd.so nd.o nsd.o 

ответ

5

Ваш all: цель должна зависеть от Lib цели, поэтому библиотека построена первая.

Аргумент -o для компилятора также нуждается в имени исполняемого файла, который он должен создать.

all: lib main.c 
    $(CC) -o main -I. -L. main.c -lnsd 

Обычно вы хотите имя цели, чтобы быть файл, который вы создаете, в противном случае все становится перестроен, когда он не нужен. (для задачи lib: та же проблема), но в качестве примера для исполняемого файла:

.PHONY: all 
all: lib main 

main: lib main.c 
    $(CC) -o main -I. -L. main.c -lnsd 
+0

работал! Спасибо. – petajamaja

2

Ответ nos находится на правильном пути.

Только появился, прежде чем работать, потому что вы случайно запустили make в правильном порядке. Он не будет работать после операции clean, потому что, как указывает nos, вы не указали все свои предпосылки. Правило, которое связывает main.o, должно зависеть от цели разделяемой библиотеки, поэтому make знает правильный порядок для создания вещей.

Кроме того, вы ДЕЙСТВИТЕЛЬНО хотите, чтобы ваши цели были фактическим файлом, который вы строите. Если они что-то другое, тогда make всегда будет думать, что они устарели, даже если вы ничего не изменили и всегда перестраиваете их.

Что-то вроде этого будет лучше:

CC = gcc 
CFLAGS = -fPIC -Wall -Werror 
CPPFLAGS = -I. 
LDFLAGS = -shared 

PROGRAM = main 
TARGET_LIB= libnsd.so 

all: $(PROGRAM) 

$(PROGRAM): main.o $(TARGET_LIB) 
     $(CC) -o [email protected] -L. main.o -lnsd 

$(TARGET_LIB): nsd.o nd.o 
     $(CC) $(LDFLAGS) -o [email protected] nsd.o nd.o -lm 

nd.o : nd.c nd.h 
nsd.o : nsd.c nsd.h 

clean: 
     rm -f libnsd.so *.o 
+1

Упс, нс обновил свой ответ точками, которые я сделал, пока я редактировал ... извините за дураков! – MadScientist

Смежные вопросы