Makefile  编写

Make  -f  makefile1 指定

如下是 本人的一点makefile学习笔记,再分享一个不错的写makefile总结的网址:

http://www.cnblogs.com/wang_yb/p/3990952.html

  1. Makefile  $@, $^, $< 
    $@  表示目标文件
    $^  表示所有的依赖文件
    $<  表示第一个依赖文件
    $?  表示比目标还要新的依赖文件列表
  1. 方式一、
  2.  
  3. 同一个目录下有多个.c .h文件
  4.  
  5. CROSS_COMPILE=arm-none-linux-gnueabi-gcc
  6. #CC=arm-none-linux-gnueabi-gcc
  7.  
  8. TEST_RES := regDebug
  9. objects = main.o uart.o
  10.  
  11. #下面这行表示依赖关系 表示所有的.o文件都是依赖于.c
  12. # $@是目标%.o
  13. %.o:%.c
  14. arm-none-linux-gnueabi-gcc -c $< -o $@
  15.  
  16. $(TEST_RES): $(objects)
  17. #$(CC) $^ -o $@
  18. $(CROSS_COMPILE) $^ -o $@
  19.  
  20. .PHONY: clean
  21.  
  22. clean:
  23. rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)
  24.  
  25. 方式二、
  26.  
  27. 同一个目录下有多个.c .h文件
  28.  
  29. CC=arm-none-linux-gnueabi-gcc
  30.  
  31. TEST_RES := regDebug
  32. objects = main.o uart.o
  33.  
  34. $(TEST_RES): $(objects)
  35. $(CC) $^ -o $@
  36.  
  37. .PHONY: clean
  38.  
  39. clean:
  40. rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)
  41.  
  42. 方法三、
  43.  
  44. 将编译生成的中间文件放在obj中,编译生成的可执行文件放在bin目录下
  45.  
  46. TEST_RES := bin/regDebug
  47.  
  48. objects = ./obj/main.o \
  49. ./obj/uart.o
  50. ./obj/%.o:%.c
  51. $(CC) -c $< -o $@
  52.  
  53. $(TEST_RES): $(objects)
  54. $(CC) $^ -o $@
  55.  
  56. .PHONY: clean
  57.  
  58. clean:
  59. rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)
  60. rm -rf $(objects)
  61.  
  62. 方法四、
  63.  
  64. OBJDIR替换了路径
  65.  
  66. OBJDIR=obj
  67.  
  68. TEST_RES := bin/regDebug
  69.  
  70. objects = $(OBJDIR)/main.o \
  71. $(OBJDIR)/uart.o
  72.  
  73. $(OBJDIR)/%.o:%.c
  74. $(CC) -c $< -o $@
  75.  
  76. $(TEST_RES): $(objects)
  77. $(CC) $^ -o $@
  78.  
  79. .PHONY: clean
  80.  
  81. clean:
  82. rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)
  83. rm -rf $(objects)
  84.  
  85. 方法五、
  86.  
  87. uart.cuart.h放在package目录下
  88.  
  89. CC=arm-none-linux-gnueabi-gcc
  90.  
  91. INCLUDDIR=-I package
  92.  
  93. OBJDIR=obj
  94.  
  95. TEST_RES := bin/regDebug
  96.  
  97. objects = $(OBJDIR)/main.o \
  98. $(OBJDIR)/uart.o
  99.  
  100. $(OBJDIR)/%.o:%.c
  101. $(CC) $(INCLUDDIR) -c $< -o $@
  102.  
  103. $(OBJDIR)/%.o:./package/%.c
  104. $(CC) $(INCLUDDIR) -c $< -o $@
  105.  
  106. $(TEST_RES): $(objects)
  107. $(CC) $^ -o $@
  108.  
  109. .PHONY: clean
  110.  
  111. clean:
  112. rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)
  113. rm -rf $(objects)
  114.  
  115. 方法六、
  116.  
  117. CC=arm-none-linux-gnueabi-gcc
  118.  
  119. INCLUDDIR=-I package
  120.  
  121. OBJDIR=obj
  122.  
  123. TEST_RES := bin/regDebug
  124.  
  125. OBJECTS = $(OBJDIR)/main.o
  126.  
  127. -include ./package/obj.mk
  128.  
  129. $(OBJDIR)/%.o:%.c
  130.  
  131. $(CC) $(INCLUDDIR) -c $< -o $@
  132.  
  133. $(OBJDIR)/%.o:./package/%.c
  134.  
  135. $(CC) $(INCLUDDIR) -c $< -o $@
  136.  
  137. $(TEST_RES): $(OBJECTS)
  138.  
  139. $(CC) $^ -o $@
  140.  
  141. .PHONY: clean
  142.  
  143. clean:
  144. rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)
  145. rm -rf $(OBJECTS)
  146.  
  147.  
  148. obj.mk
  149.  
  150. OBJECTS += ./obj/uart.o
  151.  
  152. 方法七、
  153.  
  154. 把所有头文件都放在include目录下
  155.  
  156. CC=arm-none-linux-gnueabi-gcc
  157.  
  158. INCLUDDIR=-I include
  159.  
  160. OBJDIR=obj
  161.  
  162. TEST_RES := bin/regDebug
  163.  
  164. OBJECTS = $(OBJDIR)/main.o
  165.  
  166. -include ./package/obj.mk
  167.  
  168. $(OBJDIR)/%.o:%.c
  169.  
  170. $(CC) $(INCLUDDIR) -c $< -o $@
  171.  
  172. $(OBJDIR)/%.o:./package/%.c
  173.  
  174. $(CC) $(INCLUDDIR) -c $< -o $@
  175.  
  176. $(TEST_RES): $(OBJECTS)
  177.  
  178. $(CC) $^ -o $@
  179.  
  180. .PHONY: clean
  181.  
  182. clean:
  183. rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)
  184. rm -rf $(OBJECTS)
  185.  
  186. 方法八、
  187.  
  188.  
  189. #CC=arm-none-linux-gnueabi-gcc
  190.  
  191. #INCLUDDIR=-I include
  192.  
  193. #OBJDIR=obj
  194.  
  195. -include rules.mk
  196.  
  197. TEST_RES := bin/regDebug
  198.  
  199. OBJECTS = $(OBJDIR)/main.o
  200.  
  201. -include ./package/obj.mk
  202.  
  203. $(OBJDIR)/%.o:%.c
  204.  
  205. $(CC) $(INCLUDDIR) -c $< -o $@
  206.  
  207. $(OBJDIR)/%.o:./package/%.c
  208.  
  209. $(CC) $(INCLUDDIR) -c $< -o $@
  210.  
  211. $(TEST_RES): $(OBJECTS)
  212.  
  213. $(CC) $^ -o $@
  214.  
  215. .PHONY: clean
  216.  
  217. clean:
  218. rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)
  219. rm -rf $(OBJECTS)
  220.  
  221. rules.mk文件中
  222.  
  223. CC=arm-none-linux-gnueabi-gcc
  224.  
  225. INCLUDDIR=-I include
  226.  
  227. OBJDIR=obj

方法九、

目录结构如下

bin下为可执行文件

include 下为头文件

obj 下为编译的中间文件

package下为各种c文件

根目录下makefile

-include rules.mk

TEST_RES := bin/regDebug

OBJECTS = $(OBJDIR)/main.o

-include ./package/obj.mk

$(OBJDIR)/%.o:%.c

$(CC) $(INCLUDDIR) -c $< -o $@ -std=gnu99

$(OBJDIR)/%.o:./package/%.c

$(CC) $(INCLUDDIR) -c $< -o $@ -std=gnu99

$(TEST_RES): $(OBJECTS)

$(CC) $^ -o $@ -lpthread -std=gnu99

chmod a+x $@

.PHONY: clean

clean:

rm -rf  .*.cmd *.o *.mod.c  .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)

rm -rf  $(OBJECTS)

根目录下 rules.mk:

CC=arm-none-linux-gnueabi-gcc

INCLUDDIR=-I include

OBJDIR=obj

package目录下 obj.mk

OBJECTS += ./obj/uart.o \

./obj/Console.o \

./obj/reg_data.o \

./obj/func.o \

./obj/run.o \

./obj/revDataOne.o

方法十、

obj-m := driver.o
MAKEOPT := \
ARCH="arm" \
CROSS_COMPILE="arm-none-linux-gnueabi-"

ARM_LINUX_KERNEL := "/home/zhangbh/firmware/build_dir/linux-brcm5830_sxxx-prolin2/linux-3.6.5/"

PWD = $(shell pwd)

all:
$(MAKE) $(MAKEOPT) -C $(ARM_LINUX_KERNEL) M=$(PWD) modules

clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions Module.symvers .Makefile.swp modules.order

方法十一、

L_DIR=-L /home/zhangbh/new/firmware/staging_dir/target-arm-none-linux-gnueabi/usr/lib
I_DIR=-I /home/zhangbh/new/firmware/staging_dir/target-arm-none-linux-gnueabi/usr/include/

L_FLAG=-losal \
-lcbinder \
-ljpeg \
-lfreetype \
-lpng \
-lz \
-lpthread \
-lrt \
-lcrypt \
-lssl \
-lcrypto \
-lts \
-lprop \
-lcutils \
-lxui

VBS_t:VBS.c
arm-none-linux-gnueabi-gcc -o $@ $< $(I_DIR) $(L_DIR) $(L_FLAG)

方法十三、

obj-m:=demo.o

ARCH:=arm
CROSS_COMPILE:=/home/zhangbh/cygnus/3.5.4-RC2/iproc/buildroot/buildroot/host/usr/bin/
KERNEL_HEADERS:=/home/zhangbh/cygnus/3.5.4-RC2/iproc/kernel/linux-3.6.5

build:kernel_modules
kernel_modules:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNEL_HEADERS) M=$(CURDIR) modules

clean:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNEL_HEADERS) M=$(CURDIR) clean

方式十四、 驱动和应用反汇编调试 objdump

obj-m := kmod-demo1.o
MAKEOPT := ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
#CFLAGS := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
ARM_LINUX_KERNEL := /home/zhangbh/Prolin_os/si/Prolin/firmware_cygnus/build_dir/linux-brcm5830_sxxx-prolin2/linux-3.6.5
ccflags-y :=-g
PWD = $(shell pwd)

all:
$(MAKE) $(MAKEOPT) -C $(ARM_LINUX_KERNEL) M=$(PWD) modules

.PHONY: clean

clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions Module.symvers .Makefile.swp modules.order

  1. info 可以用来在makefile中打印
  2.  
  3. include $(TOPDIR)/.config
  4. $(info tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt)
  5. $(info $(CONFIG_ENABLE_AA))
  6.  
  7. include $(TOPDIR)/.config
  8. ifeq ($(CONFIG_ENABLE_PCI),y)
  9. EXTRA_CFLAGS += -DCONFIG_ENABLE_PCI
  10. endif
  11.  
  12. ifeq ($(CONFIG_ENABLE_PCI),y)
  13.  
  14. EXTRA_CPPFLAGS += -DCONFIG_ENABLE_PCI
  15. endif
  16.  
  17. 编译的时候可以在error时停下
  18.  
  19. #ifdef CONFIG_ENABLE_PCI
  20. #error "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
  21. printk("\r\n\r\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa===============\r\n\r\n");
  22. #endif

如有转载请注明出处

新浪博客:http://blog.sina.com.cn/u/2049150530
博客园:http://www.cnblogs.com/sky-heaven/
知乎:http://www.zhihu.com/people/zhang-bing-hua

手把手教你写makefile【原创】的更多相关文章

  1. [原创]手把手教你写网络爬虫(4):Scrapy入门

    手把手教你写网络爬虫(4) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 上期我们理性的分析了为什么要学习Scrapy,理由只有一个,那就是免费,一分钱都不用花! 咦?怎么有人扔西红柿 ...

  2. [原创]手把手教你写网络爬虫(5):PhantomJS实战

    手把手教你写网络爬虫(5) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 大家好!从今天开始,我要与大家一起打造一个属于我们自己的分布式爬虫平台,同时也会对涉及到的技术进行详细介绍.大 ...

  3. [原创]手把手教你写网络爬虫(7):URL去重

    手把手教你写网络爬虫(7) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 本期我们来聊聊URL去重那些事儿.以前我们曾使用Python的字典来保存抓取过的URL,目的是将重复抓取的UR ...

  4. 手把手教你写LKM rookit! 之 第一个lkm程序及模块隐藏(一)

    唉,一开始在纠结起个什么名字,感觉名字常常的很装逼,于是起了个这<手把手教你写LKM rookit> 我觉得: 你们觉得:...... 开始之前,我们先来理解一句话:一切的操作都是系统调用 ...

  5. 手把手教你写电商爬虫-第三课 实战尚妆网AJAX请求处理和内容提取

    版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 看完两篇,相信大家已经从开始的 ...

  6. 手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染

    版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 手把手教你写电商爬虫-第三课 ...

  7. 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

    本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...

  8. 手把手教你写Sublime中的Snippet

    手把手教你写Sublime中的Snippet Sublime Text号称最性感的编辑器, 并且越来越多人使用, 美观, 高效 关于如何使用Sublime text可以参考我的另一篇文章, 相信你会喜 ...

  9. 只有20行Javascript代码!手把手教你写一个页面模板引擎

    http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...

随机推荐

  1. cf1000D Yet Another Problem On a Subsequence (dp)

    设f[i]是以i为开头的好子序列的个数 那么有$f[i]=\sum\limits_{j=i+a[i]+1}^{N+1}{f[j]*C_{j-i-1}^{a[i]}}$(设f[N+1]=1)就是以i为开 ...

  2. hdu 2158 最短区间版大家来找碴(尺取法)

    Problem Description 给定一个序列,有N个整数,数值范围为[0,N).有M个询问,每次询问给定Q个整数,可能出现重复值.要求找出一个最短区间,该区间要包含这Q个整数数值.你能找的出来 ...

  3. oh-my-zsh的安装与基本配置

    1. 准备工作 安装需要用到:wget curl git zsh 官网:http://ohmyz.sh/ GitHub主页:https://github.com/robbyrussell/oh-my- ...

  4. 在Vue中如何使用axios跨域访问数据(转)

    最近在项目中需要用到axios,所以就恶补一下这个axios到底是什么东东.越来它是vue-resource的替代品,官网也说了,以后都用axios, vue-resource不在维护.那么这个axi ...

  5. springboot整合activiMQ

    首先说明: 队列queue  的特点就是,许多人可以监听它,但是只有一个人能够收到消息. 主题topic    的特点就是,许多人监听它,都能收到消息. 需要安装activiMQ在自己的电脑上.启动方 ...

  6. CSS实现文字竖排排版

    CSS实现文字竖排 注意: writing-mode: vertical-rl;存在兼容性问题,在IE上正常,在谷歌的低版本上可能识别不了. 如果文字少的话考虑直接在每一个文字中间加一个<br& ...

  7. WebSocket实战之——JavaScript例子

    一.详细代码案例 详细解读一个简单html5 WebSocket的Js实例教程,附带完整的javascript websocket实例源码,以及实例代码效果演示页面,并对本实例的核心代码进行了深入解读 ...

  8. python执行centos命令

    import os improt sys import re import commands a = commands.getoutput("ls -al /") print a

  9. springboot(八)自定义Filter、自定义Property

    自定义Filter 我们常常在项目中会使用filters用于录调用日志.排除有XSS威胁的字符.执行权限验证等等. Spring Boot自动添加了OrderedCharacterEncodingFi ...

  10. 第16月第25天 tableView设置UITableViewStyleGrouped顶部有空余高度

    1. 正确的处理方法 1)设置标头的高度为特小值 (不能为零 为零的话苹果会取默认值就无法消除头部间距了) UIView *view = [[UIView alloc]initWithFrame:CG ...