只使用通配符的第一个条目生成文件



我刚刚进入Makefiles,我在.o文件中转换.cpp文件时遇到了问题。要使用的文件列表定义如下:

# Directories
BIN_DIR = bin
SRC_DIR = src
ICD_DIR = include
OBJ_DIR = $(BIN_DIR)/obj


# Files
SOURCES := $(wildcard $(SRC_DIR)/*.cpp)
OBJECTS  := $(SOURCES:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o)
EXECUTABLE = main

如果我@echo文件,我有我想要的:

SOURCES
src/main.cpp src/random_graph.cpp src/word_graph.cpp
OBJECTS
bin/obj/main.o bin/obj/random_graph.o bin/obj/word_graph.o
为了编译程序,我有以下两个函数:
# Make executables from objects
$(BIN_DIR)/$(EXECUTABLE): $(OBJECTS)
$(CXX) $(CXXFLAGS) $^ -o $@
@echo "Build successful!"
# Make objects
$(OBJECTS): $(SOURCES)
mkdir -p $(@D)
$(CXX) $(CXXFLAGS) -c $< -o $@

问题是,在制作目标文件时,我想链接src/main.cpp -> bin/obj/main.o,src/random_graph.cpp -> bin/obj/random_graph.osrc/word_graph.cpp -> bin/obj/word_graph.o,但它将src/main.cpp链接到每个目标文件(制作3个副本)。

是否有办法将每个.cpp文件链接到具有相同名称的对象.o文件?

我建议您创建一个模式来构建单个对象文件:

$(BIN_DIR)/$(EXECUTABLE): $(OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ $(OBJECTS)
bin/obj/%.o : src/%.cpp | $(OBJ_DIR)
$(CXX) $(CXXFLAGS) -c $< -o $@
$(OBJ_DIR):
mkdir -p $(OBJ_DIR)

由于$(BIN_DIR)/$(EXECUTABLE)需要所有的目标文件,它们都将使用上面的bin/obj/%.o来构建,每个目标文件也依赖于相应的源文件,所以对源文件的任何更改都将导致目标文件的重新构建。

你也可以像上面那样移出$(OBJ_DIR)的创建。如果它已经存在,则无需尝试创建它。

相关内容

最新更新