makefile学习
Makefile学习
0.【跟我一起写Makefile】阅读记录
- make命令会自动智能地根据当前的文件修改的情况来决定哪些文件需要重新编译,从而自动编译所需要的文件和链接目标程序。
- makefile中的第一个目标文件会视为最终的目标文件。
- make会自动推导命令,只要make看到一个
file.o
文件,它就会自动地把对应的file.c
文件加在依赖关系中,并且cc -c file.c
也会被推导出来。(见这篇2.5节) - makefile可以通过
include
关键字包含其它makefile。(见这篇2.10节)
1.Makefile的基础写法
我的一个例子
文件结构:
|---include
| |---*.h
|---src
| |---baseline
| |---*.c
| |---bean
| |---*.c
| |---util
| |---*.c
|---main.cpp
all: hinscan
hinscan: .obj/main.o .obj/SCAN.o .obj/MetaPath.o .obj/DataReader.o .obj/HomoGraphBuilder.o
g++ .obj/main.o .obj/SCAN.o .obj/MetaPath.o .obj/DataReader.o .obj/HomoGraphBuilder.o -o hinscan
.obj/main.o: main.cpp
g++ -c -O3 -std=c++20 -I ./include -o .obj/main.o main.cpp
.obj/SCAN.o: ./src/baseline/SCAN.cpp
g++ -c -O3 -std=c++20 -I ./include -o .obj/SCAN.o ./src/baseline/SCAN.cpp
.obj/MetaPath.o: ./src/bean/MetaPath.cpp
g++ -c -O3 -std=c++20 -I ./include -o .obj/MetaPath.o ./src/bean/MetaPath.cpp
.obj/DataReader.o: ./src/util/DataReader.cpp
g++ -c -O3 -std=c++20 -I ./include -o .obj/DataReader.o ./src/util/DataReader.cpp
.obj/HomoGraphBuilder.o: ./src/util/HomoGraphBuilder.cpp
g++ -c -O3 -std=c++20 -I ./include -o .obj/HomoGraphBuilder.o ./src/util/HomoGraphBuilder.cpp
clean:
#rd /s /q .obj
rm -rf *o .obj
mkdir .obj
2.Makefile的进阶写法
我的一个例子
CC = g++
CFLAGS = -c -O3 -std=c++20 -I include
SRC_BASELINE = src/baseline
SRC_BEAN = src/bean
SRC_UTIL = src/util
TARGET_DIR = .obj
SRCS = $(wildcard $(SRC_BASELINE)/*.cpp $(SRC_BEAN)/*.cpp $(SRC_UTIL)/*.cpp)
OBJS := $(patsubst $(SRC_BASELINE)/%.cpp, $(TARGET_DIR)/%.o, $(filter $(SRC_BASELINE)/%.cpp, $(SRCS)))
OBJS += $(patsubst $(SRC_BEAN)/%.cpp, $(TARGET_DIR)/%.o, $(filter $(SRC_BEAN)/%.cpp, $(SRCS)))
OBJS += $(patsubst $(SRC_UTIL)/%.cpp, $(TARGET_DIR)/%.o, $(filter $(SRC_UTIL)/%.cpp, $(SRCS)))
OBJS += $(TARGET_DIR)/main.o
all: hinscan
hinscan: $(OBJS)
$(CC) $(OBJS) -o hinscan
$(TARGET_DIR)/%.o: $(SRC_BASELINE)/%.cpp | $(TARGET_DIR)
$(CC) $(CFLAGS) $< -o $@
$(TARGET_DIR)/%.o: $(SRC_BEAN)/%.cpp | $(TARGET_DIR)
$(CC) $(CFLAGS) $< -o $@
$(TARGET_DIR)/%.o: $(SRC_UTIL)/%.cpp | $(TARGET_DIR)
$(CC) $(CFLAGS) $< -o $@
$(TARGET_DIR)/main.o: main.cpp
$(CC) $(CFLAGS) $< -o $@
$(TARGET_DIR):
mkdir $(TARGET_DIR)
clean:
rd /s /q .obj
#运行结果
mkdir .obj
g++ -c -O3 -std=c++20 -I include src/baseline/Pscan.cpp -o .obj/Pscan.o
g++ -c -O3 -std=c++20 -I include src/baseline/SCAN.cpp -o .obj/SCAN.o
g++ -c -O3 -std=c++20 -I include src/bean/MetaPath.cpp -o .obj/MetaPath.o
g++ -c -O3 -std=c++20 -I include src/util/DataReader.cpp -o .obj/DataReader.o
g++ -c -O3 -std=c++20 -I include src/util/HomoGraphBuilder.cpp -o .obj/HomoGraphBuilder.o
g++ -c -O3 -std=c++20 -I include src/util/Utility.cpp -o .obj/Utility.o
g++ -c -O3 -std=c++20 -I include main.cpp -o .obj/main.o
g++ .obj/Pscan.o .obj/SCAN.o .obj/MetaPath.o .obj/DataReader.o .obj/HomoGraphBuilder.o .obj/Utility.o .obj/main.o -o hinscan