如何使用来自单个目标的 makefile 创建多个可执行文件

How to create multiple executables using makefile from a single target

我正在尝试为以相同方式构建的多个文件构建可执行文件。当我 运行 make 时,应该生成所有可执行文件。我在宏的先决条件部分遇到错误。

CXX       = g++
CXX_FLAGS = -g -Wall
LD_FLAGS  =

INC_DIR  = -I/my/path/include
SRC_DIR  = .
LIB_DIR  = -L$/my/path/lib
OBJ_DIR  = obj
EXE_DIR  = exe

SRCS := $(foreach s_dir, $(SRC_DIR), $(wildcard $(s_dir)/*.cpp))
OBJS := $(patsubst $(SRC_DIR)/%.cpp, $(OBJ_DIR)/%.o, $(SRCS))
EXES := $(patsubst $(SRC_DIR)/%.cpp, $(EXE_DIR)/%.out, $(SRCS))


all:  create_directories create_objects create_exes

create_directories:
    @echo "Creating $(OBJ_DIR) and $(EXE_DIR)..."
    @mkdir -p obj
    @mkdir -p exe

create_objects:
  $(foreach b_dir, $(OBJ_DIR), $(eval $(call build-objects, $(b_dir))))

create_exes:
  $(foreach ot, $(EXE_DIR), $(eval $(call build-exes, $(ot))))

define build-objects
/%.o: %.cpp
    $(CXX) $(CXX_FLAGS) $(INC_DIR) -MMD -MP -c $$< -o $$@
endef


define build-exes
/%.out:obj/%.o 
    $(CXX) $(LD_FLAGS) -o $@ $(OBJS) $(LIB_DIR) -lmylib
endef

这是生成多个 exe 的正确方法还是任何其他简单方法?

如果我没看错这个 makefile,那就太复杂了。

首先让我们制定一个构建目标文件的规则:

$(OBJ_DIR)/%.o: %.cpp
    $(CXX) $(CXX_FLAGS) $(INC_DIR) -MMD -MP -c $< -o $@

现在,如果我们不确定 obj/ 是否存在,我们可以添加一个规则来创建它,但现在让我们设置一个故障保护(我们稍后会回过头来) ):

$(OBJ_DIR)/%.o: %.cpp
    @mkdir -p $(OBJ_DIR)
    $(CXX) $(CXX_FLAGS) $(INC_DIR) -MMD -MP -c $< -o $@

以及构建可执行文件的类似规则:

$(EXE_DIR)/%.out: $(OBJ_DIR)/%.o
    @mkdir -p $(EXE_DIR)
    $(CXX) $(LD_FLAGS) -o $@ $^ $(LIB_DIR) -lmylib

最后(在顶部)一些变量、文件列表和 all 规则:

CXX       = g++
CXX_FLAGS = -g -Wall
LD_FLAGS  = 
INC_DIR   = -I/my/path/include

SRC_DIR  = .
LIB_DIR  = -L$/my/path/lib
OBJ_DIR  = obj
EXE_DIR  = exe

SRCS := $(wildcard $(SRC_DIR)/*.cpp)
EXES := $(patsubst $(SRC_DIR)/%.cpp, $(EXE_DIR)/%.out, $(SRCS))
# Let the object files take care of themselves

all: $(EXES)

这就是您所需要的。一旦一切正常,我们就可以讨论构建目录规则等改进。