简单的Makefile编写

目录结构:
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) 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值