makefile多目录的.c 格式.cpp混合编译
原文地址:http://blog.csdn.net/yangbingzhou/article/details/50218315
- #
- # 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文件时会出错,因此根据自己需要,对上述文件做了修改,能够正常使用了。
- #
- # 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)
makefile多目录的.c 格式.cpp混合编译相关推荐
- 在linux批量删除多级目录下同一格式的文件
在linux批量删除多级目录下同一格式的文件,可采用find + exec命令组合: 如在删除指定目录下的,所有子目录中,后缀为.doc的文件方法为: find file_path -type f - ...
- java 指定文件格式_java删除指定目录下指定格式文件的方法
本文实例为大家分享了java删除指定目录下指定格式文件的具体代码,供大家参考,具体内容如下 正在看疯狂java讲义这本书,发现源码中有我不需要的class文件,想批量把它删除 代码如下: import ...
- java删除指定文件_java删除指定目录下指定格式文件的方法
本文实例为大家分享了java删除指定目录下指定格式文件的具体代码,供大家参考,具体内容如下 正在看疯狂java讲义这本书,发现源码中有我不需要的class文件,想批量把它删除 代码如下: import ...
- VS里面关于.cpp文件与.cu文件混合编译问题---不要在.cpp文件声明核函数(__device__()和global__())
原文出处:点击打开链接 ############################################################# 不要在.cpp文件声明核函数,否则会报错,具体可以参 ...
- ❤Linux文件、目录与磁盘格式总结❤
文章目录 Linux文件.目录与磁盘格式总结 Linux文件权限 chgrp chmod chown 文件种类 Linux文件扩展名 Linux文件与目录管理 常用的目录解释 目录树 绝对路径与相对路 ...
- R语言ggplot2可视化、在一张图中画出两条曲线(two lines in same ggplot2 graph)、使用pdf函数将ggplot2可视化图像保存到指定目录的pdf格式文件中
R语言ggplot2可视化.在一张图中画出两条曲线(two lines in same ggplot2 graph).使用pdf函数将ggplot2可视化图像保存到指定目录的pdf格式文件中 目录
- Linux下c和cuda混合编译,并生成动态链接库.so和使用
Linux下c和cuda混合编译,并生成动态链接库.so和使用 2016-08-27 14:27 98人阅读 评论(0) 收藏 举报 分类: Linux 版权声明:本文为博主原创文章,未经博主允许不得 ...
- 嵌入式学习笔记之一:嵌入式linux中混合编译入门
编译原理 编译工具将我们的源码文件最终编译成可执行文件,并不是一步到位的,其中要经过一个类似工厂流水线的过程,交叉编译工具中包含负责处理各个环节的功能工具,所以叫做交叉编译工具链. 编译的一般过程分为 ...
- VS2005混合编译ARM汇编代码
2019独角兽企业重金招聘Python工程师标准>>> 在开发过程中,发现简单的在Storage Memory区域拷贝或粘贴文件不能达到硬件量测的要求,需要直接通过编写ARM汇编指令 ...
最新文章
- php根据某一键值去除二维数组中重复值,php根据某一键值去除二维数组中重复值...
- 辽宁省风力发电行业“十四五”前景规划及竞争策略分析报告2022-2028年版
- [Luogu] 1600
- SSR rendering exceeded timeout 3000, fallbacking to CSR for
- 【jzoj】2018.1.31 NOIP普及组——D组模拟赛
- corda_Corda服务的异步流调用
- 如何清理电脑c盘_【电脑】第一期干货:如何正确清理C盘?
- 使用Mysql进行分页与排序
- 【工作日志】2013-02-01
- python——numpy——roll()函数
- 一文吃透strcmp函数
- 通信接口——RS-232与RS-422及RS-485三者之间的特性与区别
- php hex2bin_PHP bin2hex()函数与示例
- CSDN日报190221——被裁的第50天,我终于拿到心仪公司Offer
- rest接口案例_REST和平:微服务与现实案例中的整体
- 机器学习系列(一)——机器学习简介
- 必须要了解的物联网安全知识
- 修改latex表格内容无衬线字体
- python怎样使用各个日期赤纬_科学网—PyEphem基本功能介绍 - 张金龙的博文
- 一元线性回归及Excel回归分析