我在做一个简单的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: atention: instructions cancelled for 'build/NetcpSend.o' objective.
makefile:51: atention: 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 $@ $< $(CFLAGS)
$(OBJECTS_DIR)/generic_l.o: $(SRC_DIR)/generic_l.cc
$(CC) -c -o $@ $< $(CFLAGS)
$(OBJECTS_DIR)/socket_c.o: $(SRC_DIR)/socket_c.cc
$(CC) -c -o $@ $< $(CFLAGS)
$(OBJECTS_DIR)/file_c.o: $(SRC_DIR)/file_c.cc
$(CC) -c -o $@ $< $(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 $@ $< $(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是否按照标准是正确的。有人能帮我一把吗?
没有netcpreceive.o
的规则,只有netcpsend.o
和其他规则。
由于所有的对象构建方法看起来都很相似,所以您可以/应该声明一个模式规则:
$(OBJECTS_DIR)/%.o: $(SRC_DIR)/%.cc
$(CC) -c -o $@ $< $(CFLAGS)
您的可执行程序配方也可以改进。分别声明制作方法和设置先决条件:
# Prerequisites
$(BIN_DIR)/NetcpSend: $(OBJ1)
$(BIN_DIR)/NetcpReceive: $(OBJ2)
# Recipes
$(BIN_DIR)/NetcpReceive $(BIN_DIR)/NetcpSend:
$(CC) -o $@ $^ $(CFLAGS)
我个人在使用make时尽量不要弄乱对象和bin文件夹。