Makefile игнорирует определенные строки

#c #makefile

#c #makefile

Вопрос:

Я создаю простой проект на C , в котором используются две разные программы (одна отправляет информацию, а другая получает ее, если вам интересно). Я создал makefile для компиляции обеих программ и создания двух исполняемых файлов за один раз, но когда я выполняю свою make инструкцию, я получаю следующую ошибку:

 makefile:51: atención: se anulan las instrucciones para el objetivo 'build/NetcpSend.o'
makefile:32: atención: se ignoran las instrucciones viejas para el objetivo 'build/NetcpSend.o'
g   -c -o build/NetcpSend.o src/NetcpSend.cc -g -std=c  11
g   -c -o build/generic_l.o src/generic_l.cc -g -std=c  11
g   -c -o build/socket_c.o src/socket_c.cc -g -std=c  11
g   -c -o build/file_c.o src/file_c.cc -g -std=c  11
g   -o bin/NetcpSend build/NetcpSend.o build/generic_l.o build/socket_c.o build/file_c.o -g -std=c  11
make: *** No hay ninguna regla para construir el objetivo 'build/NetcpReceive.o', necesario para 'NetcpReceive'.  Alto.
 

Перевод:

 makefile:51: warning: instructions cancelled for 'build/NetcpSend.o' objective.
makefile:51: warning: instructions cancelled for 'build/NetcpReceive.o' objective.
g   -c -o build/NetcpSend.o src/NetcpSend.cc -g -std=c  11
g   -c -o build/generic_l.o src/generic_l.cc -g -std=c  11
g   -c -o build/socket_c.o src/socket_c.cc -g -std=c  11
g   -c -o build/file_c.o src/file_c.cc -g -std=c  11
g   -o bin/NetcpSend build/NetcpSend.o build/generic_l.o build/socket_c.o build/file_c.o -g -std=c  11
make: *** No rule to build 'build/NetcpReceive.o', needed for NetcpReceive. Stop.
 

И когда я пытаюсь выполнить NetcpReceive, он, очевидно, не находит исполняемый файл, потому что он еще не скомпилирован.

Это мой makefile:

 CC=g  
CFLAGS=-g -std=c  11

INCLUDE_DIR=include
OBJECTS_DIR=build
SRC_DIR=src
BIN_DIR=bin

_OBJ1 = NetcpSend.o generic_l.o socket_c.o file_c.o
OBJ1 = $(patsubst %,$(OBJECTS_DIR)/%,$(_OBJ1))

_OBJ2 = NetcpReceive.o generic_l.o socket_c.o file_c.o
OBJ2 = $(patsubst %,$(OBJECTS_DIR)/%,$(_OBJ2))

BIN_NAME1 = NetcpSend
BIN_NAME2 = NetcpReceive

all: All NetcpSend NetcpReceive

All: 
$(OBJECTS_DIR)/NetcpSend.o: $(SRC_DIR)/NetcpSend.cc
    $(CC) -c -o $@

lt; $(CFLAGS)

$(OBJECTS_DIR)/generic_l.o: $(SRC_DIR)/generic_l.cc
$(CC) -c -o $@


lt; $(CFLAGS)

$(OBJECTS_DIR)/socket_c.o: $(SRC_DIR)/socket_c.cc
$(CC) -c -o $@


lt; $(CFLAGS)

$(OBJECTS_DIR)/file_c.o: $(SRC_DIR)/file_c.cc
$(CC) -c -o $@


lt; $(CFLAGS)

NetcpSend: $(OBJ1)
$(CC) -o $(BIN_DIR)/$(BIN_NAME1) $^ $(CFLAGS)

NetcpReceive: $(OBJ2)
$(CC) -o $(BIN_DIR)/$(BIN_NAME2) $^ $(CFLAGS)

$(OBJECTS_DIR)/NetcpSend.o: $(SRC_DIR)/NetcpSend.cc
$(CC) -c -o $@


lt; $(CFLAGS)

run: #Runs the code
./$(BIN_DIR)/$(BIN_NAME1)
./$(BIN_DIR)/$(BIN_NAME2)

dbg: #Debugs the code
gdb ./$(BIN_DIR)/$(BIN_NAME)

.PHONY: clean

clean:
@rm -f $(OBJECTS_DIR)/*.o $(BIN_DIR)/* $(BIN_DIR)/*

Я не знаю, что вызывает проблему, и если мой makefile верен в соответствии со стандартами. Может кто-нибудь помочь мне?

Комментарии:

1. Используйте remake , remake -x чтобы понять, что происходит

Ответ №1:

Не существует правила для NetcpReceive.o , только NetcpSend.o и другие.

Поскольку все ваши рецепты сборки объектов выглядят одинаково, вы можете / должны объявить правило шаблона:

 $(OBJECTS_DIR)/%.o: $(SRC_DIR)/%.cc
    $(CC) -c -o $@

lt; $(CFLAGS)

Ваш рецепт для исполняемых файлов также может быть улучшен. Объявляйте рецепт и устанавливайте предварительные условия отдельно:

 # Prerequisites
$(BIN_DIR)/NetcpSend: $(OBJ1)
$(BIN_DIR)/NetcpReceive: $(OBJ2)

# Recipes
$(BIN_DIR)/NetcpReceive $(BIN_DIR)/NetcpSend:
    $(CC) -o $@ $^ $(CFLAGS)
 

Я лично стараюсь не связываться с папками object и bin при использовании make.

Комментарии:

1. По какой-то причине, ничего не меняя, объявление правила шаблона решило все за один раз. Спасибо @Andreas.