我刚刚进入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.o
和src/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)
的创建。如果它已经存在,则无需尝试创建它。