如何使用来自单个目标的 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)
这就是您所需要的。一旦一切正常,我们就可以讨论构建目录规则等改进。
我正在尝试为以相同方式构建的多个文件构建可执行文件。当我 运行 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)
这就是您所需要的。一旦一切正常,我们就可以讨论构建目录规则等改进。