提问者:小点点

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: 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是否按照标准是正确的。有人能帮我一把吗?


共1个答案

匿名用户

没有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文件夹。