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