Build 如何从单个目标使用makefile创建多个可执行文件

Build 如何从单个目标使用makefile创建多个可执行文件,build,makefile,gnu-make,Build,Makefile,Gnu Make,我正在尝试为以相同方式构建的多个文件构建可执行文件。当我运行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), $

我正在尝试为以相同方式构建的多个文件构建可执行文件。当我运行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
$1/%.o: %.cpp
    $(CXX) $(CXX_FLAGS) $(INC_DIR) -MMD -MP -c $$< -o $$@
endef


define build-exes
$1/%.out:obj/%.o 
    $(CXX) $(LD_FLAGS) -o $@ $(OBJS) $(LIB_DIR) -lmylib
endef
CXX=g++
CXX_标志=-g-墙
区旗=
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),$(通配符$(s_dir)/*.cpp))
OBJS:=$(patsubst$(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRCS))
EXES:=$(patsubst$(SRC_DIR)/%.cpp,$(EXE_DIR)/%.out,$(SRCS))
全部:创建目录创建对象创建EXE
创建目录:
@echo“正在创建$(OBJ_DIR)和$(EXE_DIR)
@mkdir-p obj
@mkdir-p exe
创建\u对象:
$(foreach b_dir,$(OBJ_dir),$(eval$(call build objects,$(b_dir)))
创建前男友:
$(foreach-ot,$(EXE\u-DIR),$(eval$(call-build-exes,$(ot)))
定义构建对象
$1/%.o:%.cpp
$(CXX)$(CXX_标志)$(INC_DIR)-MMD-MP-c$<-o$$@
恩德夫
定义构建EXE
$1/%.out:obj/%.o
$(CXX)$(LD_标志)-o$@$(OBJS)$(LIB_DIR)-lmylib
恩德夫

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

如果我正确地阅读了这个makefile,那么它就太复杂了

首先,让我们有一个构建对象文件的规则:

$(OBJ_DIR)/%.o: %.cpp
    $(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)

这就是你所需要的。一旦这一切正常运行,我们就可以讨论一些改进,比如建立目录的规则。

每个源文件对应一个且只有一个可执行文件,对吗?
create\u objects
create\u exes
目标在这里没有任何方法(
eval
不返回任何内容)。您正在评估可以在配方位置构建内容的模式规则。这是一件奇怪的事。您是否试图在主执行期间使这些功能可用?
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)