目录结构:
include :存放头文件的目录
obj :存放中间文件.o目录
src :存放源文件.c 和.cpp文件目录
Makefile :编写解释命令脚本文件
#D_SRC = src
#D_OBJ = obj
#notdir表示去除目录,则$(notdir $(SRC_C))表示a.c b.c
#patsubst表示把$(notdir $(SRC_C))中的.c替换成.o,即a.o b.o
#addprefix表示增加前缀$(D_OBJ)/,则OBJ_C变量表示为obj/a.o obj/b.o
#SRC_C = $(wildcard $(D_SRC)/*.cpp) # wildcard表示把$(D_SRC)目录下的.c文件遍历出来
#SRC_C = $(foreach dir, $(D_SRC), $(wildcard $(dir)/*.c))
# foreach表示遍历$(D_SRC)的所有子目录同时把子目录下的.c文件遍历出来,假设src目录中有a.c,b.c,则$(SRC_C) 表示 src/a.c src/b.c
#OBJ_C = $(addprefix $(D_OBJ)/,$(patsubst %.cpp,%.o,$(notdir $(SRC_C)))) #生成所有的.o文件依赖
#$@ 表示目标文件 $^ :表示所有的依赖文件 $< :表示第一个依赖文件 $? :表示比目标还要新的依赖文件列表
CPP := g++ -std=c++11 #指定编译器类型
CFLAGS += -Wall -g
CXXFLAGS += -Wall -g
#源文件目录
D_SRC = src
#添加头文件目录
INCLUDE = -I ./include
INCLUDE += -I /usr/include
#添加库文件
LIBS :=-L /usr/lib/ -ljson
#指定可执行文件名称
TAR = test2
SRC = $(wildcard $(D_SRC)/*.cpp) #把$(D_SRC)目录下的.cpp文件遍历出来
OBJS = $(patsubst %.cpp,%.o,$(SRC)) #生成.o文件的依赖
$(TAR) : $(OBJS)
$(CPP) $(CXXFLAGS) $^ -o $@ $(LIBS)
%.o : %. cpp
$(CPP) $(CXXFLAGS) $^ -c $< -o $@ $(INCLUDE)
.PHONY:
clear:
rm -rf $(OBJS) $(TAR)
c和c++一起编译
CPP := g++ -std=c++11 #指定编译器类型
CC := gcc
CFLAGS += -Wall -g
CXXFLAGS += -Wall -g
#源文件目录
D_SRC = src
#添加头文件目录
INCLUDE = -I ./include
INCLUDE += -I /usr/include
#添加库文件
#LIBS :=-L /usr/lib/ -ljson
#指定可执行文件名称
TAR = Receive
SRC_C = $(wildcard $(D_SRC)/*.c) #把$(D_SRC)目录下的.c文件遍历出来
SRC_CPP = $(wildcard $(D_SRC)/*.cpp) #把$(D_SRC)目录下的.cpp文件遍历出来
#OBJFILE = $(SRC_C:.c=.o) $(SRC_CPP:.cpp=.o) #中间不要有空格,不然会删除c和cpp文件
OBJS = $(patsubst %.c,%.o,$(SRC_C)) $(patsubst %.cpp,%.o,$(SRC_CPP)) #生成.o文件的依赖
all:$(TAR)
$(TAR) : $(OBJS)
$(CPP) $(CXXFLAGS) $^ -o $@ $(INCLUDE)
%.o : %.cpp
$(CPP) $(CXXFLAGS) -c $< -o $@ $(INCLUDE)
%.o : %.c
$(CC) $(CFLAGS) -c $< -o $@ $(INCLUDE)
.PHONY:
clean:
rm -rf $(TAR) $(OBJS)
上两种写法都是将源文件和.o文件都放在一起了,这样不太标准,下面是将他俩分开放:
将.o文件和.c .cpp文件分开放:
CPP := g++ -std=c++11 #指定编译器类型
CC := gcc
CFLAGS += -Wall -g
CXXFLAGS += -Wall -g
#源文件目录
D_SRC = ./src/
OBJ_DIR = ./obj/
#添加头文件目录
INCLUDE = -I ./include
INCLUDE += -I /usr/include
#添加库文件
LIBS :=-L /usr/lib/ -ljson -L /usr/local/lib -l:libopencv_core.so -l:libopencv_imgproc.so -l:libopencv_videoio.so -l:libopencv_highgui.so -l:libopencv_imgcodecs.so
#指定可执行文件名称
TAR = Receive
SRC_C = $(wildcard $(D_SRC)*.c) #把$(D_SRC)目录下的.c文件遍历出来
SRC_CPP = $(wildcard $(D_SRC)*.cpp) #把$(D_SRC)目录下的.cpp文件遍历出来
#OBJFILE = $(SRC_C:.c=.o) $(SRC_CPP:.cpp=.o) #中间不要有空格,不然会删除c和cpp文件
OBJS = $(patsubst %.c,%.o,$(SRC_C)) $(patsubst %.cpp,%.o,$(SRC_CPP)) #生成.o文件的依赖
OBJ = $(notdir $(OBJS)) #去除.o文件前的文件夹名字 例如上步生成./src/a.o ./src/b.o ,去掉之后就是a.o b.o
OBJ_all = $(addprefix $(OBJ_DIR), $(OBJ)) #将上步的.o文件重新加上存放的目录 ./obj/a.o ./obj/b.o
all:$(TAR)
#$(TAR) : $(OBJS)
$(TAR) : $(OBJ_all)
$(CPP) $(CXXFLAGS) $^ -o $@ $(INCLUDE) $(LIBS)
#%.o : %.cpp
$(OBJ_DIR)%.o : $(D_SRC)%.cpp
$(CPP) $(CXXFLAGS) -c $< -o $@ $(INCLUDE) $(LIBS)
$(OBJ_DIR)%.o : $(D_SRC)%.c
$(CC) $(CFLAGS) -c $< -o $@ $(INCLUDE) $(LIBS)
.PHONY:
clean:
#rm -rf $(TAR) $(OBJS)
rm -rf $(TAR) $(OBJ_all)