Makefile或makefile学习通用模板

Makefile或makefile学习通用模板

文章目录

  • Makefile或makefile学习通用模板
  • 一、单编译器编译.c程序
  • 二、单编译器编译.c和.cpp程序
  • 三、两个编译器分别编译所有的.c和.cpp程序
  • 四、两个编译器分别编译指定文件夹下的.c和.cpp程序

一、单编译器编译.c程序

  1. 项目文件:Makefile或makefile学习通用模板_第1张图片

  2. makefile

#author:zyh
#date:2022-06-12
#使用gcc编译器编译.c程序


#编译目标
TARGET:=test

#编译器
CC:=gcc

#c文件所在的各个文件夹
SRCS:= $(wildcard src/*.c)
SRCS+= $(wildcard ./*.c)

#.h文件所在的各个文件夹
INCS:= -I includes/


#各个文件夹下的.c文件替换为.o文件
OBJS:=$(SRCS:.c=.o)
#OBJS:=$(patsubst %c, %o, $(SRCS))

#编译器一些参数
CFLAGS:= -Wall

#程序所用到的库
LIBS:= -lpthread


all: $(TARGET)
%.o: %.c
	$(CC) -c $< $(INCS) -o $@ $(CFLAGS)
	
$(TARGET): $(OBJS)
	$(info target:$@)
	$(info all:$^)
	$(info first:$<)
	$(CC) -o $@ $^ $(LIBS)


clean:
	rm -f $(OBJS) $(TARGET)
  1. 结果Makefile或makefile学习通用模板_第2张图片

二、单编译器编译.c和.cpp程序

  1. 项目文件:
    Makefile或makefile学习通用模板_第3张图片

  2. makefile:

#author:zyh
#date:2022-06-12
#使用g++编译器同时编译.c和.cpp程序

#编译目标
TARGET:=test

#编译器
CC:=gcc
CXX:=g++

#.c或.cpp文件所在的各个文件夹
SRCS:= $(wildcard src/*.c)
SRCS+= $(wildcard ./*.c)
SRCS+= $(wildcard src/*.cpp)
SRCS+= $(wildcard ./*.cpp)

#.h头文件所在的各个文件夹
INCS:= -I includes/

#各个文件夹下的.c和.cpp替换为.o文件
OBJ:=$(SRCS:.c=.o)
OBJS:=$(OBJ:.cpp=.o)

#编译器的一些参数
CFLAGS:= -Wall -lstdc++

#程序所用到的库
LIBS:= -lpthread

all: $(TARGET)
%.o: %.c
	$(CXX) -c $< $(INCS) -o $@ $(CFLAGS)

%.o: %.cpp
	$(CXX) -c $< $(INCS) -o $@ $(CFLAGS)
	
$(TARGET): $(OBJS)
	$(info target:$@)
	$(info all:$^)
	$(info first:$<)
	
	$(CXX) -o $@ $^ $(LIBS)

clean:
	rm -f $(OBJS) $(TARGET)
  1. 结果:
    Makefile或makefile学习通用模板_第4张图片

三、两个编译器分别编译所有的.c和.cpp程序

使用gcc编译所有的.c,使用g++编译所有的.cpp程序,最后再编译所有的.o成可执行文件

  1. 项目文件:
    Makefile或makefile学习通用模板_第5张图片

因为test.h头文件被使用,所以必须采用extern “C”
Makefile或makefile学习通用模板_第6张图片
2. makefile:

#author:zyh
#date:2022-06-12
#使用gcc编译所有的.c,使用g++编译所有的.cpp程序,最后再编译所有的.o成可执行文件

#编译目标
TARGET:=test

#编译器
CC:=gcc
CXX:=g++

#.c文件所在的各个文件夹
SRCS:= $(wildcard src/*.c)
SRCS+= $(wildcard ./*.c)

#.cpp文件所在的各个文件夹
CPPSRCS:=$(wildcard src/*.cpp)
CPPSRCS+=$(wildcard ./*.cpp)

#.h头文件所在的各个文件夹
INCS:= -I includes/

#各个文件夹下的.c替换为.o文件
OBJS:=$(SRCS:.c=.o)
#各个文件夹下的.cpp替换为.o文件
CPPOBJS:=$(CPPSRCS:.cpp=.o)

#编译器的一些参数
CFLAGS:= -Wall
CPPFLAGS:= -Wall -lstdc++

#程序所用到的库
LIBS:= -lpthread

all: $(TARGET)

%.o: %.c
	$(CC) -c $< $(INCS) -o $@ $(CFLAGS)
	
%.o: %.cpp
	$(CXX) -c $< $(INCS) -o $@ $(CPPFLAGS)

$(TARGET): $(OBJS) $(CPPOBJS)
	$(info target:$@)
	$(info all:$^)
	$(info first:$<)
	
	$(CXX) -o $@ $^ $(LIBS)
#$(CC) -o $@ $^ $(LIBS)

clean:
	rm -f $(OBJS) $(CPPOBJS) $(TARGET)

  1. 结果:
    Makefile或makefile学习通用模板_第7张图片

四、两个编译器分别编译指定文件夹下的.c和.cpp程序

使用g++编译指定文件夹下的.c和.cpp,再使用gcc编译其它文件夹下的.c,最后再编译所有的.o成可执行文件

  1. 项目文件:
    test.h头文件必须采用extern “C”
    Makefile或makefile学习通用模板_第8张图片
    Makefile或makefile学习通用模板_第9张图片
  2. makefile:
#author:zyh
#date:2022-06-12
#使用g++指定编译某个文件夹下的.c和.cpp,再使用gcc编译其它的.c,最后再编译所有的.o成可执行文件

#编译目标
TARGET:=test

#编译器
CC:=gcc
CXX:=g++

#某个文件夹下的.c
SRCS:= $(wildcard src/*.c)

#某个文件夹下的.c和.cpp
SRCS1:= $(wildcard src/test/*.c)
CPPSRCS1:= $(wildcard src/test/*.cpp)


#.h头文件所在的各个文件夹
INCS:= -I includes/

#某个文件夹下的.c替换为.o文件
OBJS:=$(SRCS:.c=.o)
#某个文件夹下.c替换为.o文件
OBJS1:=$(SRCS1:.c=.o)
#某个文件夹下.cpp替换为.o文件
CPPOBJS1:=$(CPPSRCS1:.cpp=.o)

#编译器的一些参数
CFLAGS:= -Wall
CPPFLAGS:= -Wall -lstdc++

#程序所用到的库
LIBS:= -lpthread

all: $(TARGET)

$(OBJS1) : %.o : %.c
	$(CXX) -c $< -o $@ $(INCS) $(CPPFLAGS)

$(CPPOBJS1) : %.o : %.cpp
	$(CXX) -c $< -o $@ $(INCS) $(CPPFLAGS)
	
$(OBJS) : %.o : %.c
	$(CC) -c $< -o $@ $(CFLAGS) $(INCS)	

$(TARGET): $(OBJS) $(OBJS1) $(CPPOBJS1)
	$(CC) -o $@ $^ $(LIBS)
#$(CXX) -o $@ $^ $(LIBS)

clean:
	rm -f $(OBJS) $(OBJS1) $(CPPOBJS1) $(TARGET)

  1. 结果:
    Makefile或makefile学习通用模板_第10张图片

你可能感兴趣的:(c++,c语言,学习)