您的位置:首页 > 编程语言 > C语言/C++

makefile多目录的.c 格式.cpp混合编译

2017-12-05 16:05 1201 查看
原文地址:http://blog.csdn.net/yangbingzhou/article/details/50218315

[cpp]
view plain
copy
print?

#  
# c.cpp混合编译的makefile模板  
#  
#  
  
  
BIN = test.exe  
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 也相当于隐含的引入了生成规则  
#故上面不能在出现如: $(OBJS) : $(DEF)之类。切记  
include $(CDEF)  
include $(CPPDEF)  
.PHONY:clean cleanall  
  
#清除所有目标文件以及生成的最终目标文件  
clean:              
    rm $(BIN) $(COBJS) $(CPPOBJS)  
#rm *.d  
cleanall:  
    rm $(CDEF) $(CPPDEF)  
    rm $(BIN) $(COBJS) $(CPPOBJS)  

转自:http://lcinx.blog.163.com/blog/static/434942672010913291210/

上述makefile文件使用时,生成.d文件时会出错,因此根据自己需要,对上述文件做了修改,能够正常使用了。

[cpp]
view plain
copy
print?

#  
# 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) 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: