我正在尝试为以相同方式构建的多个文件构建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或任何其他简单方法的正确方法吗?
答案 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)
这就是你所需要的一切。一旦完美运行,我们就可以讨论诸如构建目录的规则之类的改进。