Makefile:指定SRC和OBJ目录。

9 篇文章 1 订阅
2 篇文章 0 订阅

推荐:非常详尽的Makefile教程(链接)。

需求:

1、指定源代码目录./src,编译目录下所有.cpp文件;

2、指定目标文件目录./obj,存放编译生成的.obj文件;

3、.cpp文件名唯一,根据cpp文件名自动确定.o文件名。

实现(WSL-ubuntu 18.04):

1、获取源代码目录下源文件名:SRC = $(wildcard $(SRC_DIR)/*.cpp)

2、字符串替换获取目标文件名:OBJECTS = $(patsubst $(SRC_DIR)/%.cpp, %.o, $(SRC))

3、指定源代码默认搜索路径:VPATH = $(SRC_DIR)。如果不指定VPATH,需要在目标文件生成规则指定路径:

4、连接时为目标文件增加目录路径。

5、vpath %.o $(OBJ_DIR),避免每次make全量重新编译。 

完整的 Makefile:

CC = g++
CFLAGS = -lpthread

TARGET  = app
OBJ_DIR = ./obj
SRC_DIR = ./src

SRC = $(wildcard $(SRC_DIR)/*.cpp)
OBJECTS = $(patsubst $(SRC_DIR)/%.cpp, %.o, $(SRC))

VPATH = $(SRC_DIR)
vpath %.o $(OBJ_DIR)

all: $(TARGET)

$(TARGET) : $(OBJECTS)
	$(CC) -o $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) $(CFLAGS)

%.o : %.cpp
	$(CC) -c $< -o $(OBJ_DIR)/$@

.PHONY : clean
clean:
	rm -rf $(TARGET) $(OBJ_DIR)/*.o ./*.o

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于多目录和头文件的编译,可以使用Makefile来管理和编译代码。 以下是一个例子: ``` # Makefile # 设置编译器和编译选项 CC = g++ CFLAGS = -Wall -g # 设置源文件目录和头文件目录 SRCDIR = src INCDIR = include # 设置目标文件目录和可执行文件目录 OBJDIR = obj BINDIR = bin # 设置目标文件和可执行文件名称 TARGET = program OBJS = $(OBJDIR)/main.o $(OBJDIR)/func.o # 编译规则 all: $(BINDIR)/$(TARGET) $(BINDIR)/$(TARGET): $(OBJS) $(CC) $(CFLAGS) $(OBJS) -o $@ $(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(CC) $(CFLAGS) -c $< -o $@ -I $(INCDIR) # 清理规则 clean: rm -rf $(OBJDIR)/*.o $(BINDIR)/$(TARGET) ``` 在这个例子,我们假设有以下目录结构: ``` project/ ├── Makefile ├── include/ │ └── func.h └── src/ ├── main.cpp └── func.cpp ``` 其,`include/`存放头文件,`src/`存放源文件。使用Makefile编译时,会将编译生成的目标文件放在`obj/`目录,将可执行文件放在`bin/`目录Makefile,`SRCDIR`和`INCDIR`分别指向源文件目录和头文件目录。在编译规则,使用`-I`选项指定头文件目录。`OBJS`的目标文件路径是相对于`OBJDIR`的。 在编译时,Makefile会按照`SRCDIR`和`INCDIR`指定的路径查找源文件和头文件。生成的目标文件和可执行文件会放在`OBJDIR`和`BINDIR`指定目录。 使用命令`make`即可编译生成可执行文件。使用命令`make clean`可以清除生成的目标文件和可执行文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值