makefile多⽬录的.c格式.cpp混合编译#
# c.cpp混合编译的makefile模板
#
#
BIN =
CC = gcc
CPP = g++
#这⾥只加⼊库头⽂件路径及库路径
INCS = -I"c:/mingw/include"
LIBS = -L"c:/mingw/lib"
SUBDIRS =
#⽣成依赖信息时的搜索⽬录,⽐如到下列⽬录中搜索⼀个依赖⽂件(⽐如.h⽂件),例如 -I"./***/" -I"./base/"
DEFINC =
#给INCS加上依赖搜索路径,分开写可能会产⽣不⼀致情况,⽽且繁琐
INCS += $(DEFINC)
#
#
#maintest.c tree/rbtree.c  多了⼦⽬录,那就直接添加⽬录/*.c即可所有的源⽂件--  .c⽂件列表
CSRCS = $(wildcard ./*.c)
CPPSRCS = $(wildcard ./*.cpp)
#SRCS += $(wildcard ./../base/*.c)
#SRCS += $(wildcard ./*.c ./src/*.c ./src/base/*.c ./src/base/tree/*.c ./src/mem/*.c)
#
#
#所有的.o⽂件列表
COBJS := $(CSRCS:.c=.o)
CPPOBJS := $(CPPSRCS:.cpp=.o)
#
#⽣成依赖信息 -MM是只⽣成⾃⼰的头⽂件信息,-M 包含了标准库头⽂件信息。
#-MT 或 -MQ都可以改变⽣成的依赖  xxx.o:src/xxx.h 为 src/xxx.o:src/xxx.h 当然。前⾯的 src/xxx.o需⾃⼰指定
#格式为 -MM 输⼊.c或.cpp  查依赖路径  -MT或-MQ  ⽣成规则,⽐如src/xxx.o
MAKEDEPEND = gcc -MM -MT
CFLAGS += $(INCS)
CFLAGS += -O2 -Wall -fomit-frame-pointer -g -ansi
CPPFLAGS += $(INCS)
CPPFLAGS += -O2 -Wall -g
#-g ⽣成调试信息
#-pedantic参数与-ansi⼀起使⽤会⾃动拒绝编译⾮ANSI程序
#-fomit-frame-pointer 去除函数框架
#-Wmissing-prototypes -Wstrict-prototypes 检查函数原型
#针对每个.c⽂件的.d依赖⽂件列表
CDEF = $(CSRCS:.c=.d)
CPPDEF = $(CPPSRCS:.cpp=.d)
all:$(BIN)
#⽣成.o的对⾃⼰⽬录中.h .c的依赖信息.d⽂件到.c所在的路径中
#$(DEF)⽂件是.d⽂件名列表(含⽬录),⽐如tree.d 匹配成功那么%就是tree,然后在尝试%.c,如果成功。则执⾏规则
# $(<:.c=.o)是获取此.c⽂件的名字(含路径),然后变为.o⽐如 src/xxx.o。以形成如下
# src/xxx.o : src/xxx.c ***.h  ***.h  最前⾯!!注意。
# 此做法是每个.d都和⽣成他的.c在⼀个⽬录⾥,所以需要这样做。
# $(<:.c=.o)之类的。此时的<;相当于变量$< 。切记
# : : :  含义同下
$(CDEF) : %.d : %.c
$(MAKEDEPEND) $(<:.c=.o) $< $(DEFINC) > $@
$(CPPDEF) : %.d : %.cpp
$(MAKEDEPEND) $(<:.cpp=.o) $< $(DEFINC) > $@
#先删除依赖信息
#重新⽣成依赖信息
#这⾥出现了⼀个 $(MAKE) 没有定义的变量。这个变量是由 Make ⾃⼰定义的,它的值即为⾃⼰的位置,⽅便 Make 递归调⽤⾃⼰。depend:
rm $(CDEF)
rm $(CPPDEF)
$(MAKE) $(CDEF)
$(MAKE) $(CPPDEF)
#$(OBJS):%.o :%.c  先⽤$(OBJS)中的⼀项,⽐如foo.o: %.o : %.c  含义为:试着⽤%.o匹配foo.o。如果成功%就等于foo。如果不成功,# Make就会警告,然后。给foo.o添加依赖⽂件foo.c(⽤foo替换了%.c⾥的%)
# 也可以不要下⾯的这个⽣成规则,因为下⾯的 include $(DEF)  就隐含了。此处为了明了,易懂。故留着
$(COBJS) : %.o: %.c
$(CC) -c $< -o $@ $(CFLAGS)
$(CPPOBJS) : %.o: %.cpp
$(CPP) -c $< -o $@ $(CPPFLAGS)
# $@--⽬标⽂件,$^--所有的依赖⽂件,$<--第⼀个依赖⽂件。每次$< $@ 代表的值就是列表中的
#
$(BIN) : $(COBJS) $(CPPOBJS)
$(CC) -o $(BIN) $(COBJS) $(CPPOBJS) $(LIBS)
rm $(COBJS)
rm $(CPPOBJS)
rm $(CDEF)
rm $(CPPDEF)
# 链接为最终⽬标
#引⼊了.o⽂件对.c和.h的依赖情况。以后.h被修改也会重新⽣成,可看看.d⽂件内容即知道为何
#引⼊了依赖就相当于引⼊了⼀系列的规则,因为依赖内容例如:⽬录/xxx.o:⽬录/xxx.c ⽬录/xxx.h 也相当于隐含的引⼊了⽣成规则
makefile phony
#故上⾯不能在出现如: $(OBJS) : $(DEF)之类。切记
include $(CDEF)
include $(CPPDEF)
.PHONY:clean cleanall
#清除所有⽬标⽂件以及⽣成的最终⽬标⽂件
clean:
rm $(BIN) $(COBJS) $(CPPOBJS)
#rm *.d
cleanall:
rm $(CDEF) $(CPPDEF)
rm $(BIN) $(COBJS) $(CPPOBJS)
转⾃:lcinx.blog.163/blog/static/434942672010913291210/
上述makefile⽂件使⽤时,⽣成.d⽂件时会出错,因此根据⾃⼰需要,对上述⽂件做了修改,能够正常使⽤了。#
# c.cpp混合编译的makefile模板
#
#
BIN = ./bin/libEthernet.so
CROSS = arm-linux-
CC = $(CROSS)gcc
CPP = $(CROSS)g++
LD = $(CROSS)ld
#这⾥只加⼊库头⽂件路径及库路径
INCS = #-I"c:/mingw/include"
LIBS = #-L"c:/mingw/lib"
SUBDIRS =
#⽣成依赖信息时的搜索⽬录,⽐如到下列⽬录中搜索⼀个依赖⽂件(⽐如.h⽂件),例如 -I"./***/" -I"./base/"
DEFINC = -I./snap7/ -I./snap7/src/sys/ -I./snap7/src/lib/ -I./snap7/src/core/
#给INCS加上依赖搜索路径,分开写可能会产⽣不⼀致情况,⽽且繁琐
INCS += $(DEFINC)
#
#maintest.c tree/rbtree.c  多了⼦⽬录,那就直接添加⽬录/*.c即可所有的源⽂件--  .c⽂件列表
CSRCS = $(wildcard ./*.c ./snap7/*.c)
CPPSRCS = $(wildcard ./snap7/src/sys/*.cpp ./snap7/src/lib/*.cpp ./snap7/src/core/*.cpp)
#
#所有的.o⽂件列表
COBJS := $(CSRCS:.c=.o)
CPPOBJS := $(CPPSRCS:.cpp=.o)
#
#⽣成依赖信息 -MM是只⽣成⾃⼰的头⽂件信息,-M 包含了标准库头⽂件信息。
#-MT 或 -MQ都可以改变⽣成的依赖  xxx.o:src/xxx.h 为 src/xxx.o:src/xxx.h 当然。前⾯的 src/xxx.o需⾃⼰指定
#格式为 -MM 输⼊.c或.cpp  查依赖路径  -MT或-MQ  ⽣成规则,⽐如src/xxx.o
#MAKEDEPEND = gcc -MM -MT
CFLAGS += $(INCS)
CFLAGS += -O2 -Wall -g -fPIC
CPPFLAGS += $(INCS)
CPPFLAGS += -O2 -Wall -g -fPIC
LDFLAGS += -shared -fPIC -lpthread -lm -lrt -lstdc++
all:$(BIN)
#$(OBJS):%.o :%.c  先⽤$(OBJS)中的⼀项,⽐如foo.o: %.o : %.c  含义为:试着⽤%.o匹配foo.o。如果成功%就等于foo。如果不成功,# Make就会警告,然后。给foo.o添加依赖⽂件foo.c(⽤foo替换了%.c⾥的%)
# 也可以不要下⾯的这个⽣成规则,因为下⾯的 include $(DEF)  就隐含了。此处为了明了,易懂。故
留着
$(COBJS) : %.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
$(CPPOBJS) : %.o: %.cpp
$(CPP) $(CPPFLAGS) -c $< -o $@
# $@--⽬标⽂件,$^--所有的依赖⽂件,$<--第⼀个依赖⽂件。每次$< $@ 代表的值就是列表中的
#
$(BIN) : $(COBJS) $(CPPOBJS)
$(CC) -o $(BIN) $(COBJS) $(CPPOBJS) $(LDFLAGS) $(LIBS)
rm $(COBJS)
rm $(CPPOBJS)
# 链接为最终⽬标
#引⼊了.o⽂件对.c和.h的依赖情况。以后.h被修改也会重新⽣成,可看看.d⽂件内容即知道为何
#引⼊了依赖就相当于引⼊了⼀系列的规则,因为依赖内容例如:⽬录/xxx.o:⽬录/xxx.c ⽬录/xxx.h 也相当于隐含的引⼊了⽣成规则#故上⾯不能在出现如: $(OBJS) : $(DEF)之类。切记
.PHONY:clean cleanall
#清除所有⽬标⽂件以及⽣成的最终⽬标⽂件
clean:
rm $(BIN) #$(COBJS) $(CPPOBJS)
#rm *.d
cleanall:
rm $(BIN) $(COBJS) $(CPPOBJS)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。