尝试运行 make client 或 make server 时,我遇到了makefile错误。我一直在寻找原因,但我无法理解。这是我的makefile:
CC=g++
CFLAGS=-c -std=c++11 -Wno-write-strings
LDFLAGS=
SOURCES= UDP_Client.cpp UDP_Server.cpp
CSOURCES = cmain.cpp UDP_Client.cpp
SSOURCES = smain.cpp UDP_Server.cpp
OBJECTS=$(SOURCES:.cpp=.o)
COBJECTS=$(CSOURCES:.cpp=.o)
SOBJECTS=$(SSOURCES:.cpp=.o)
EXECUTABLE=run
CEXECUTABLE=client
SEXECUTABLE=server
all:
@echo "Please specifiy client or server"
client: $(CSOURCES) $(CEXECUTABLE)
server: $(SSOURCES) $(SEXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
$(CEXECUTABLE): $(COBJECTS)
$(CC) $(LDFLAGS) $(COBJECTS) -o $@
$(SEXECUTABLE): $(SOBJECTS)
$(CC) $(LDFLAGS) $(SOBJECTS) -o $@
.cpp.o:
$(CC) $(CFLAGS) $< -o $@
clean:
rm *.o
我得到的错误看起来很简单,但这是他们的实际文本:
make: Circular client <- client dependency dropped.
答案 0 :(得分:1)
你告诉我client
取决于client
($(CEXECUTABLE)
展开后),这显然是错误的。
你的makefile有点令人困惑,但我认为你想要做的是
CXXFLAGS := -std=c++11 -Wno-write-strings
cobjs := cmain.o UDP_Client.o
sobjs := smain.o UDP_Server.o
.PHONY: clean
client: $(cobjs)
server: $(sobjs)
client server:
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@
clean:
$(RM) $(cobjs) $(sobjs)
你不需要你定义的大多数规则和变量,make已经知道如何编译东西。实际上,如果您将cmain.cpp
重命名为client.cpp
并将smain.o
重命名为server.cpp
(并相应地更改了makefile中.o
文件的名称),那么您就赢了甚至需要client
和server
的配方。
我不确定你要对run
做什么,它是不同的可执行文件吗?如果是这样,它如何取决于UDP_Client.o
和UDP_Server.o
,因为可能没有定义main
函数?