如何修改我的 Makefile 以便构建两个不同的可执行文件

How can I modify my Makefile so that I build two different executables

我有一个可以正常工作的 Makefile,但现在我想修改它以便我可以构建两个不同的可执行文件(即 client.exe、server.exe)。在我的目录中,有一个client.cpp和一个server.cpp,每个都有一个main函数。我知道我无法构建具有多个主要功能的可执行文件。最终,我希望能够使用 'make client'、'make server' 或类似的东西构建可执行文件(client.exe 或 server.exe)。

我在这个网站上看到过类似的问题,但是我看到的所有解决方案都假设源文件的数量不会改变。以这个解决方案为例:Makefile to compile multiple C programs? Or this question: How can I configure my makefile for debug and release builds? 我不想每次添加新源文件时都必须更新我的 Makefile。

如何修改 Makefile 以便构建两个不同的可执行文件?

SRC_DIR := src
OBJ_DIR := obj
BIN_DIR := bin

EXE := $(BIN_DIR)/client.exe
SRC := $(wildcard $(SRC_DIR)/*.cpp)
OBJ := $(subst $(SRC_DIR),$(OBJ_DIR),$(SRC:.cpp=.o))
DEP := $(OBJ:.o=.d)

.PHONY: clean

all: $(EXE)

CXX      := g++
CPPFLAGS := -I$(PWD) -MMD -MP
CXXFLAGS := -std=c++17
LDFLAGS  := -L /usr/lib/x86_64-linux-gnu
CFLAGS   := -Wall

$(EXE): $(OBJ) | $(BIN_DIR)
    $(CXX) $(LDFLAGS) $^ -o $@

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp | $(OBJ_DIR)
    $(CXX) $(CPPFLAGS) $(CFLAGS) $(CXXFLAGS) -c $< -o $@

$(BIN_DIR) $(OBJ_DIR):
    mkdir -p $@

clean:
    @$(RM) -rv $(BIN_DIR) $(OBJ_DIR)

-include $(DEP)

我试图根据我使用的命令排除 client.cpp 或 server.cpp 文件(例如 'make client' 或 'make server')。但是我走到了死胡同,因为我不知道如何制定排除一个文件的规则。

SRC := $(filter-out $(SRC_DIR)/client.cpp, $(wildcard $(SRC_DIR)/*.cpp))
SRC := $(filter-out $(SRC_DIR)/server.cpp, $(wildcard $(SRC_DIR)/*.cpp))

只需为您的两个可执行文件构建两个不同的目标文件列表:

...
EXE := $(patsubst %,$(BIN_DIR)/%.exe,client server)
...
CLIENT_OBJ := $(filter-out $(OBJ_DIR)/server.o,$(OBJ))
SERVER_OBJ := $(filter-out $(OBJ_DIR)/client.o,$(OBJ))

.PHONY: all client server

all: $(EXE)
client: $(BIN_DIR)/client.exe
server: $(BIN_DIR)/server.exe

$(BIN_DIR)/client.exe: $(CLIENT_OBJ)
$(BIN_DIR)/server.exe: $(SERVER_OBJ)

$(EXE): | $(BIN_DIR)
    $(CXX) $(LDFLAGS) $^ -o $@
...