原文地址:http://blog.csdn.net/yangbingzhou/article/details/50218315

[cpp] view plaincopyprint?

  1. #
  2. # c.cpp混合编译的makefile模板
  3. #
  4. #
  5. BIN = test.exe
  6. CC = gcc
  7. CPP = g++
  8. #这里只加入库头文件路径及库路径
  9. INCS = -I"c:/mingw/include"
  10. LIBS = -L"c:/mingw/lib"
  11. SUBDIRS =
  12. #生成依赖信息时的搜索目录,比如到下列目录中搜索一个依赖文件(比如.h文件),例如 -I"./***/" -I"./base/"
  13. DEFINC =
  14. #给INCS加上依赖搜索路径,分开写可能会产生不一致情况,而且繁琐
  15. INCS += $(DEFINC)
  16. #
  17. #
  18. #maintest.c tree/rbtree.c  多了子目录,那就直接添加 目录/*.c即可   所有的源文件--  .c文件列表
  19. CSRCS = $(wildcard ./*.c)
  20. CPPSRCS = $(wildcard ./*.cpp)
  21. #SRCS += $(wildcard ./../base/*.c)
  22. #SRCS += $(wildcard ./*.c ./src/*.c ./src/base/*.c ./src/base/tree/*.c ./src/mem/*.c)
  23. #
  24. #
  25. #所有的.o文件列表
  26. COBJS := $(CSRCS:.c=.o)
  27. CPPOBJS := $(CPPSRCS:.cpp=.o)
  28. #
  29. #生成依赖信息 -MM是只生成自己的头文件信息,-M 包含了标准库头文件信息。
  30. #-MT 或 -MQ都可以改变生成的依赖  xxx.o:src/xxx.h 为 src/xxx.o:src/xxx.h 当然。前面的 src/xxx.o需自己指定
  31. #格式为 -MM 输入.c或.cpp  查找依赖路径  -MT或-MQ  生成规则,比如src/xxx.o
  32. MAKEDEPEND = gcc -MM -MT
  33. CFLAGS += $(INCS)
  34. CFLAGS += -O2 -Wall -fomit-frame-pointer -g -ansi
  35. CPPFLAGS += $(INCS)
  36. CPPFLAGS += -O2 -Wall -g
  37. #-g 生成调试信息
  38. #-pedantic参数与-ansi一起使用 会自动拒绝编译非ANSI程序
  39. #-fomit-frame-pointer 去除函数框架
  40. #-Wmissing-prototypes -Wstrict-prototypes 检查函数原型
  41. #针对每个.c文件的.d依赖文件列表
  42. CDEF = $(CSRCS:.c=.d)
  43. CPPDEF = $(CPPSRCS:.cpp=.d)
  44. all:$(BIN)
  45. #生成.o的对自己目录中.h .c的依赖信息.d文件到.c所在的路径中
  46. #$(DEF)文件是.d文件名列表(含目录),比如tree.d 匹配成功那么%就是tree,然后在尝试%.c,如果成功。则执行规则
  47. # $(<:.c=.o)是获取此.c文件的名字(含路径),然后变为.o比如 src/xxx.o。 以形成如下
  48. # src/xxx.o : src/xxx.c ***.h  ***.h  最前面!!注意。
  49. # 此做法是每个.d都和生成他的.c在一个目录里,所以需要这样做。
  50. # $(<:.c=.o)之类的 。此时的<相当于变量$< 。切记
  51. # : : :  含义同下
  52. $(CDEF) : %.d : %.c
  53. $(MAKEDEPEND) $(<:.c=.o) $< $(DEFINC) > $@
  54. $(CPPDEF) : %.d : %.cpp
  55. $(MAKEDEPEND) $(<:.cpp=.o) $< $(DEFINC) > $@
  56. #先删除依赖信息
  57. #重新生成依赖信息
  58. #这里出现了一个 $(MAKE) 没有定义的变量。这个变量是由 Make 自己定义的,它的值即为自己的位置,方便 Make 递归调用自己。
  59. depend:
  60. rm $(CDEF)
  61. rm $(CPPDEF)
  62. $(MAKE) $(CDEF)
  63. $(MAKE) $(CPPDEF)
  64. #$(OBJS):%.o :%.c  先用$(OBJS)中的一项,比如foo.o: %.o : %.c  含义为:试着用%.o匹配foo.o。如果成功%就等于foo。如果不成功,
  65. # Make就会警告,然后。给foo.o添加依赖文件foo.c(用foo替换了%.c里的%)
  66. # 也可以不要下面的这个生成规则,因为下面的 include $(DEF)  就隐含了。此处为了明了,易懂。故留着
  67. $(COBJS) : %.o: %.c
  68. $(CC) -c $< -o $@ $(CFLAGS)
  69. $(CPPOBJS) : %.o: %.cpp
  70. $(CPP) -c $< -o $@ $(CPPFLAGS)
  71. # $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。每次$< $@ 代表的值就是列表中的
  72. #
  73. $(BIN) : $(COBJS) $(CPPOBJS)
  74. $(CC) -o $(BIN) $(COBJS) $(CPPOBJS) $(LIBS)
  75. rm $(COBJS)
  76. rm $(CPPOBJS)
  77. rm $(CDEF)
  78. rm $(CPPDEF)
  79. # 链接为最终目标
  80. #引入了.o文件对.c和.h的依赖情况。以后.h被修改也会重新生成,可看看.d文件内容即知道为何
  81. #引入了依赖就相当于引入了一系列的规则,因为依赖内容例如: 目录/xxx.o:目录/xxx.c 目录/xxx.h 也相当于隐含的引入了生成规则
  82. #故上面不能在出现如: $(OBJS) : $(DEF)之类。切记
  83. include $(CDEF)
  84. include $(CPPDEF)
  85. .PHONY:clean cleanall
  86. #清除所有目标文件以及生成的最终目标文件
  87. clean:
  88. rm $(BIN) $(COBJS) $(CPPOBJS)
  89. #rm *.d
  90. cleanall:
  91. rm $(CDEF) $(CPPDEF)
  92. rm $(BIN) $(COBJS) $(CPPOBJS)

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

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

[cpp] view plaincopyprint?
  1. #
  2. # c.cpp混合编译的makefile模板
  3. #
  4. #
  5. BIN = ./bin/libEthernet.so
  6. CROSS = arm-linux-
  7. CC = $(CROSS)gcc
  8. CPP = $(CROSS)g++
  9. LD = $(CROSS)ld
  10. #这里只加入库头文件路径及库路径
  11. INCS = #-I"c:/mingw/include"
  12. LIBS = #-L"c:/mingw/lib"
  13. SUBDIRS =
  14. #生成依赖信息时的搜索目录,比如到下列目录中搜索一个依赖文件(比如.h文件),例如 -I"./***/" -I"./base/"
  15. DEFINC = -I./snap7/ -I./snap7/src/sys/ -I./snap7/src/lib/ -I./snap7/src/core/
  16. #给INCS加上依赖搜索路径,分开写可能会产生不一致情况,而且繁琐
  17. INCS += $(DEFINC)
  18. #
  19. #maintest.c tree/rbtree.c  多了子目录,那就直接添加 目录/*.c即可   所有的源文件--  .c文件列表
  20. CSRCS = $(wildcard ./*.c ./snap7/*.c)
  21. CPPSRCS = $(wildcard ./snap7/src/sys/*.cpp ./snap7/src/lib/*.cpp ./snap7/src/core/*.cpp)
  22. #
  23. #所有的.o文件列表
  24. COBJS := $(CSRCS:.c=.o)
  25. CPPOBJS := $(CPPSRCS:.cpp=.o)
  26. #
  27. #生成依赖信息 -MM是只生成自己的头文件信息,-M 包含了标准库头文件信息。
  28. #-MT 或 -MQ都可以改变生成的依赖  xxx.o:src/xxx.h 为 src/xxx.o:src/xxx.h 当然。前面的 src/xxx.o需自己指定
  29. #格式为 -MM 输入.c或.cpp  查找依赖路径  -MT或-MQ  生成规则,比如src/xxx.o
  30. #MAKEDEPEND = gcc -MM -MT
  31. CFLAGS += $(INCS)
  32. CFLAGS += -O2 -Wall -g -fPIC
  33. CPPFLAGS += $(INCS)
  34. CPPFLAGS += -O2 -Wall -g -fPIC
  35. LDFLAGS += -shared -fPIC -lpthread -lm -lrt -lstdc++
  36. all:$(BIN)
  37. #$(OBJS):%.o :%.c  先用$(OBJS)中的一项,比如foo.o: %.o : %.c  含义为:试着用%.o匹配foo.o。如果成功%就等于foo。如果不成功,
  38. # Make就会警告,然后。给foo.o添加依赖文件foo.c(用foo替换了%.c里的%)
  39. # 也可以不要下面的这个生成规则,因为下面的 include $(DEF)  就隐含了。此处为了明了,易懂。故留着
  40. $(COBJS) : %.o: %.c
  41. $(CC) $(CFLAGS) -c $< -o $@
  42. $(CPPOBJS) : %.o: %.cpp
  43. $(CPP) $(CPPFLAGS) -c $< -o $@
  44. # $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。每次$< $@ 代表的值就是列表中的
  45. #
  46. $(BIN) : $(COBJS) $(CPPOBJS)
  47. $(CC) -o $(BIN) $(COBJS) $(CPPOBJS) $(LDFLAGS) $(LIBS)
  48. rm $(COBJS)
  49. rm $(CPPOBJS)
  50. # 链接为最终目标
  51. #引入了.o文件对.c和.h的依赖情况。以后.h被修改也会重新生成,可看看.d文件内容即知道为何
  52. #引入了依赖就相当于引入了一系列的规则,因为依赖内容例如: 目录/xxx.o:目录/xxx.c 目录/xxx.h 也相当于隐含的引入了生成规则
  53. #故上面不能在出现如: $(OBJS) : $(DEF)之类。切记
  54. .PHONY:clean cleanall
  55. #清除所有目标文件以及生成的最终目标文件
  56. clean:
  57. rm $(BIN) #$(COBJS) $(CPPOBJS)
  58. #rm *.d
  59. cleanall:
  60. rm $(BIN) $(COBJS) $(CPPOBJS)

makefile多目录的.c 格式.cpp混合编译相关推荐

  1. 在linux批量删除多级目录下同一格式的文件

    在linux批量删除多级目录下同一格式的文件,可采用find + exec命令组合: 如在删除指定目录下的,所有子目录中,后缀为.doc的文件方法为: find file_path -type f - ...

  2. java 指定文件格式_java删除指定目录下指定格式文件的方法

    本文实例为大家分享了java删除指定目录下指定格式文件的具体代码,供大家参考,具体内容如下 正在看疯狂java讲义这本书,发现源码中有我不需要的class文件,想批量把它删除 代码如下: import ...

  3. java删除指定文件_java删除指定目录下指定格式文件的方法

    本文实例为大家分享了java删除指定目录下指定格式文件的具体代码,供大家参考,具体内容如下 正在看疯狂java讲义这本书,发现源码中有我不需要的class文件,想批量把它删除 代码如下: import ...

  4. VS里面关于.cpp文件与.cu文件混合编译问题---不要在.cpp文件声明核函数(__device__()和global__())

    原文出处:点击打开链接 ############################################################# 不要在.cpp文件声明核函数,否则会报错,具体可以参 ...

  5. ❤Linux文件、目录与磁盘格式总结❤

    文章目录 Linux文件.目录与磁盘格式总结 Linux文件权限 chgrp chmod chown 文件种类 Linux文件扩展名 Linux文件与目录管理 常用的目录解释 目录树 绝对路径与相对路 ...

  6. R语言ggplot2可视化、在一张图中画出两条曲线(two lines in same ggplot2 graph)、使用pdf函数将ggplot2可视化图像保存到指定目录的pdf格式文件中

    R语言ggplot2可视化.在一张图中画出两条曲线(two lines in same ggplot2 graph).使用pdf函数将ggplot2可视化图像保存到指定目录的pdf格式文件中 目录

  7. Linux下c和cuda混合编译,并生成动态链接库.so和使用

    Linux下c和cuda混合编译,并生成动态链接库.so和使用 2016-08-27 14:27 98人阅读 评论(0) 收藏 举报 分类: Linux 版权声明:本文为博主原创文章,未经博主允许不得 ...

  8. 嵌入式学习笔记之一:嵌入式linux中混合编译入门

    编译原理 编译工具将我们的源码文件最终编译成可执行文件,并不是一步到位的,其中要经过一个类似工厂流水线的过程,交叉编译工具中包含负责处理各个环节的功能工具,所以叫做交叉编译工具链. 编译的一般过程分为 ...

  9. VS2005混合编译ARM汇编代码

    2019独角兽企业重金招聘Python工程师标准>>> 在开发过程中,发现简单的在Storage Memory区域拷贝或粘贴文件不能达到硬件量测的要求,需要直接通过编写ARM汇编指令 ...

最新文章

  1. php根据某一键值去除二维数组中重复值,php根据某一键值去除二维数组中重复值...
  2. 辽宁省风力发电行业“十四五”前景规划及竞争策略分析报告2022-2028年版
  3. [Luogu] 1600
  4. SSR rendering exceeded timeout 3000, fallbacking to CSR for
  5. 【jzoj】2018.1.31 NOIP普及组——D组模拟赛
  6. corda_Corda服务的异步流调用
  7. 如何清理电脑c盘_【电脑】第一期干货:如何正确清理C盘?
  8. 使用Mysql进行分页与排序
  9. 【工作日志】2013-02-01
  10. python——numpy——roll()函数
  11. 一文吃透strcmp函数
  12. 通信接口——RS-232与RS-422及RS-485三者之间的特性与区别
  13. php hex2bin_PHP bin2hex()函数与示例
  14. CSDN日报190221——被裁的第50天,我终于拿到心仪公司Offer
  15. rest接口案例_REST和平:微服务与现实案例中的整体
  16. 机器学习系列(一)——机器学习简介
  17. 必须要了解的物联网安全知识
  18. 修改latex表格内容无衬线字体
  19. python怎样使用各个日期赤纬_科学网—PyEphem基本功能介绍 - 张金龙的博文
  20. 一元线性回归及Excel回归分析

热门文章

  1. ofstream写不进txt文件的奇怪问题
  2. 4、常见命令操作(详细)
  3. 高级(复杂)指针的含义
  4. error LNK2019解决办法
  5. JQuery 总结(7) index() data() each() 选项卡 表单验证
  6. Dubbo 源码分析 - 服务引用
  7. Webpack 入门教程
  8. 给Eclipse提速的7个技巧
  9. Java文件操作大全(绝对的经典,值得收藏!)
  10. 4分钟极速甩脂训练!抛开借口!繁忙族必备!