makefile学习

Makefile学习

0.【跟我一起写Makefile】阅读记录

  1. make命令会自动智能地根据当前的文件修改的情况来决定哪些文件需要重新编译,从而自动编译所需要的文件和链接目标程序。
  2. makefile中的第一个目标文件会视为最终的目标文件。
  3. make会自动推导命令,只要make看到一个file.o文件,它就会自动地把对应的file.c文件加在依赖关系中,并且cc -c file.c也会被推导出来。(见这篇2.5节
  4. 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
posted @ 2024-04-03 23:58  Xiao·Tong  阅读(16)  评论(0编辑  收藏  举报