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

时间:2015-03-30 16:05:30

标签: build makefile gnu-make

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

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

这是生成多个exes或任何其他简单方法的正确方法吗?

1 个答案:

答案 0 :(得分:0)

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

首先让我们有一个规则来构建目标文件:

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

现在,如果我们不确定obj/的存在,我们可以添加一条规则来创建它,但是暂时我们只需要设置故障保护(我们&#39;我稍后再回过头来看看:

$(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)

这就是你所需要的一切。一旦完美运行,我们就可以讨论诸如构建目录的规则之类的改进。