Makefile实现混合编译不同目录下不同的.c .cc .cpp文件,并以不同的编译方式编译

需求

文件结构如下
Makefile
dir1下有main.c func.c build.sh
dir2下有main.c func.cc build.sh
dir3下有main.c func.cpp build.sh
要求dir1和dir2下将所有文件链接为一个可执行文件,dir3下每个源文件都要编译成一个可执行文件
即编译后文件结构为
Makefile
dir1:main.c func.c build.sh a.out
dir2:main.c func.cc build.sh a.out
dir1:main.c func.cpp build.sh main func

Makefile实现

flag=0    #flag由build.sh传入,直接覆盖

ifeq ($(flag),0)
DIR=./dir1
endif

ifeq ($(flag),1)
DIR=./dir2
endif

ifeq ($(flag),2)
DIR=./dir3
endif

TARGET=$(DIR)/main.exe

C_SRC=$(wildcard $(DIR)/*.c)
CC_SRC=$(wildcard $(DIR)/*.cc)
CPP_SRC=$(wildcard $(DIR)/*.cpp)

OBJ_C=$(patsubst %.c,%.o,$(C_SRC))
OBJ_CPP=$(patsubst %.cpp,%.o,$(CPP_SRC))
OBJ_CC=$(patsubst %.cc,%.o,$(CC_SRC))

OBJS=$(OBJ_C) $(OBJ_CC) $(OBJ_CPP)

CC=g++

ifeq ($(flag),2) #flag=2对应dir3
TARGETS=$(OBJS:%.o=%)
all:$(TARGETS)
    @for i in $(TARGETS);do \
    $(CXX) -o $${i} $${i}.c*;done
.PHONY:clean
clean:
    rm  $(TARGETS)
else
$(TARGET):$(OBJS)
    $(CXX) $^ -o $@
.PHONY:clean
clean:
    -rm  $(TARGET) $(OBJS)
endif

build.sh(以dir1下实现为例)

#编译
cd ..
make flag=0

#执行
cd dir1
./main.exe

#删除
cd ..
make clean flag=0
cd dir1
pwd

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 Makefile 示例,可以编译指定目录下所有的 .c、.cc、.cpp 文件生成目标文件 main: ``` CC = gcc CXX = g++ CFLAGS = -Wall CXXFLAGS = -Wall # 源文件目录 SRC_DIR = src # 所有 .c、.cc、.cpp 文件 SRCS = $(wildcard $(SRC_DIR)/*.c) $(wildcard $(SRC_DIR)/*.cc) $(wildcard $(SRC_DIR)/*.cpp) # 目标文件目录 OBJ_DIR = obj # 所有目标文件 OBJS = $(addprefix $(OBJ_DIR)/, $(notdir $(SRCS:%.c=%.o) $(SRCS:%.cc=%.o) $(SRCS:%.cpp=%.o))) # 目标文件名 TARGET = main $(TARGET) : $(OBJS) $(CXX) -o $@ $^ $(OBJ_DIR)/%.o : $(SRC_DIR)/%.c $(CC) $(CFLAGS) -c -o $@ $< $(OBJ_DIR)/%.o : $(SRC_DIR)/%.cc $(CXX) $(CXXFLAGS) -c -o $@ $< $(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp $(CXX) $(CXXFLAGS) -c -o $@ $< .PHONY : clean clean : rm -f $(OBJ_DIR)/*.o $(TARGET) ``` 在该 Makefile 中,我们使用了以下变量: - `CC`:C 语言编译器。 - `CXX`:C++ 编译器。 - `CFLAGS`:C 语言编译选项。 - `CXXFLAGS`:C++ 编译选项。 - `SRC_DIR`:源文件目录。 - `SRCS`:所有 .c、.cc、.cpp 文件。 - `OBJ_DIR`:目标文件目录。 - `OBJS`:所有目标文件。 - `TARGET`:目标文件名。 Makefile 中的规则如下: - `$(TARGET)`:目标文件,依赖于所有目标文件,使用 C++ 编译器链接它们。 - `$(OBJ_DIR)/%.o`:目标文件的规则,依赖于对应的源文件,使用 C 或 C++ 编译编译它们。 - `.PHONY : clean`:声明 clean 是一个伪目标。 - `clean`:删除所有目标文件和目标文件。 使用命令 `make` 即可编译生成目标文件。如果要清除目标文件,可以使用命令 `make clean`。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值