手把手教你写makefile【原创】
Makefile 编写
Make -f makefile1 指定
如下是 本人的一点makefile学习笔记,再分享一个不错的写makefile总结的网址:
http://www.cnblogs.com/wang_yb/p/3990952.html
Makefile $@, $^, $<
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
方式一、 同一个目录下有多个.c .h文件 CROSS_COMPILE=arm-none-linux-gnueabi-gcc
#CC=arm-none-linux-gnueabi-gcc TEST_RES := regDebug
objects = main.o uart.o #下面这行表示依赖关系 表示所有的.o文件都是依赖于.c
# $@是目标%.o
%.o:%.c
arm-none-linux-gnueabi-gcc -c $< -o $@ $(TEST_RES): $(objects)
#$(CC) $^ -o $@
$(CROSS_COMPILE) $^ -o $@ .PHONY: clean clean:
rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES) 方式二、 同一个目录下有多个.c .h文件 CC=arm-none-linux-gnueabi-gcc TEST_RES := regDebug
objects = main.o uart.o $(TEST_RES): $(objects)
$(CC) $^ -o $@ .PHONY: clean clean:
rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES) 方法三、 将编译生成的中间文件放在obj中,编译生成的可执行文件放在bin目录下 TEST_RES := bin/regDebug objects = ./obj/main.o \
./obj/uart.o
./obj/%.o:%.c
$(CC) -c $< -o $@ $(TEST_RES): $(objects)
$(CC) $^ -o $@ .PHONY: clean clean:
rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)
rm -rf $(objects) 方法四、 用OBJDIR替换了路径 OBJDIR=obj TEST_RES := bin/regDebug objects = $(OBJDIR)/main.o \
$(OBJDIR)/uart.o $(OBJDIR)/%.o:%.c
$(CC) -c $< -o $@ $(TEST_RES): $(objects)
$(CC) $^ -o $@ .PHONY: clean clean:
rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)
rm -rf $(objects) 方法五、 将uart.c和uart.h放在package目录下 CC=arm-none-linux-gnueabi-gcc INCLUDDIR=-I package OBJDIR=obj TEST_RES := bin/regDebug objects = $(OBJDIR)/main.o \
$(OBJDIR)/uart.o $(OBJDIR)/%.o:%.c
$(CC) $(INCLUDDIR) -c $< -o $@ $(OBJDIR)/%.o:./package/%.c
$(CC) $(INCLUDDIR) -c $< -o $@ $(TEST_RES): $(objects)
$(CC) $^ -o $@ .PHONY: clean clean:
rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)
rm -rf $(objects) 方法六、 CC=arm-none-linux-gnueabi-gcc INCLUDDIR=-I package OBJDIR=obj TEST_RES := bin/regDebug OBJECTS = $(OBJDIR)/main.o -include ./package/obj.mk $(OBJDIR)/%.o:%.c $(CC) $(INCLUDDIR) -c $< -o $@ $(OBJDIR)/%.o:./package/%.c $(CC) $(INCLUDDIR) -c $< -o $@ $(TEST_RES): $(OBJECTS) $(CC) $^ -o $@ .PHONY: clean clean:
rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)
rm -rf $(OBJECTS)obj.mk OBJECTS += ./obj/uart.o 方法七、 把所有头文件都放在include目录下 CC=arm-none-linux-gnueabi-gcc INCLUDDIR=-I include OBJDIR=obj TEST_RES := bin/regDebug OBJECTS = $(OBJDIR)/main.o -include ./package/obj.mk $(OBJDIR)/%.o:%.c $(CC) $(INCLUDDIR) -c $< -o $@ $(OBJDIR)/%.o:./package/%.c $(CC) $(INCLUDDIR) -c $< -o $@ $(TEST_RES): $(OBJECTS) $(CC) $^ -o $@ .PHONY: clean clean:
rm -rf .*.cmd *.o *.mod.c .tmp_versions Module.symvers .Makefile.swp $(TEST_RES)
rm -rf $(OBJECTS) 方法八、#CC=arm-none-linux-gnueabi-gcc #INCLUDDIR=-I include #OBJDIR=obj -include rules.mk TEST_RES := bin/regDebug OBJECTS = $(OBJDIR)/main.o -include ./package/obj.mk $(OBJDIR)/%.o:%.c $(CC) $(INCLUDDIR) -c $< -o $@ $(OBJDIR)/%.o:./package/%.c $(CC) $(INCLUDDIR) -c $< -o $@ $(TEST_RES): $(OBJECTS) $(CC) $^ -o $@ .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
方法九、
目录结构如下
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
info 可以用来在makefile中打印 include $(TOPDIR)/.config
$(info tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt)
$(info $(CONFIG_ENABLE_AA)) include $(TOPDIR)/.config
ifeq ($(CONFIG_ENABLE_PCI),y)
EXTRA_CFLAGS += -DCONFIG_ENABLE_PCI
endif ifeq ($(CONFIG_ENABLE_PCI),y) EXTRA_CPPFLAGS += -DCONFIG_ENABLE_PCI
endif 编译的时候可以在error时停下 #ifdef CONFIG_ENABLE_PCI
#error "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
printk("\r\n\r\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa===============\r\n\r\n");
#endif
如有转载请注明出处
新浪博客:http://blog.sina.com.cn/u/2049150530
博客园:http://www.cnblogs.com/sky-heaven/
知乎:http://www.zhihu.com/people/zhang-bing-hua
手把手教你写makefile【原创】的更多相关文章
- [原创]手把手教你写网络爬虫(4):Scrapy入门
手把手教你写网络爬虫(4) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 上期我们理性的分析了为什么要学习Scrapy,理由只有一个,那就是免费,一分钱都不用花! 咦?怎么有人扔西红柿 ...
- [原创]手把手教你写网络爬虫(5):PhantomJS实战
手把手教你写网络爬虫(5) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 大家好!从今天开始,我要与大家一起打造一个属于我们自己的分布式爬虫平台,同时也会对涉及到的技术进行详细介绍.大 ...
- [原创]手把手教你写网络爬虫(7):URL去重
手把手教你写网络爬虫(7) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 本期我们来聊聊URL去重那些事儿.以前我们曾使用Python的字典来保存抓取过的URL,目的是将重复抓取的UR ...
- 手把手教你写LKM rookit! 之 第一个lkm程序及模块隐藏(一)
唉,一开始在纠结起个什么名字,感觉名字常常的很装逼,于是起了个这<手把手教你写LKM rookit> 我觉得: 你们觉得:...... 开始之前,我们先来理解一句话:一切的操作都是系统调用 ...
- 手把手教你写电商爬虫-第三课 实战尚妆网AJAX请求处理和内容提取
版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 看完两篇,相信大家已经从开始的 ...
- 手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染
版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 手把手教你写电商爬虫-第三课 ...
- 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接
本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...
- 手把手教你写Sublime中的Snippet
手把手教你写Sublime中的Snippet Sublime Text号称最性感的编辑器, 并且越来越多人使用, 美观, 高效 关于如何使用Sublime text可以参考我的另一篇文章, 相信你会喜 ...
- 只有20行Javascript代码!手把手教你写一个页面模板引擎
http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...
随机推荐
- bower介绍
一. bower是什么? bower是twitter推出的第三方依赖管理工具.其特点是对包结构没有强制规范,也因此bower本身并不提供一套构建工具,它充当的基本上是一个静态资源的共享平台.它可用于搜 ...
- android关闭日志
我们在开发时,经常会输出各种日志来debug代码.但是等到应用发布的apk运行时不希望它输出日志. 关闭输出日志Log.v(),Log.i(),Log.w(),Log.v(),Log.e()等 原理: ...
- module模块和包(十七)
在前面的几个章节中我们脚本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了. 为此 Python 提供了一个办法,把这些定义存放在文 ...
- R语言画棒状图(bar chart)和误差棒(error bar)
假设我们现在有CC,CG,GG三种基因型及三种基因型对应的表型,我们现在想要画出不同的基因型对应表型的棒状图及误差棒.整个命令最重要的就是最后一句了,用arrows函数画误差棒.用到的R语言如下: d ...
- (大数)Computer Transformation hdu1041
Computer Transformation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...
- CentOS下的yum upgrade和yum update区别
说明:生产环境对软件版本和内核版本要求非常精确,别没事有事随便的进行yum update操作!! ! yum update:升级所有包同时也升级软件和系统内核 yum upgrade:只升级所有包,不 ...
- 数据结构(六)查找---多路查找树(B+树)
前提 下图B树,我们要遍历它,假设每个节点都属于硬盘的不同页面,我们为了中序遍历所有的元素,页面2-页面1-页面3-页面1-页面4-页面1-页面5.而且我们每经过节点遍历时,都会对节点中的元素进行一次 ...
- lombok 工具类的介绍
lombok 是一个非常非常好用的工具类.打个比方,一个bean,需要字段,get set方法 无参有参构造器,重写equals和hashcode,字段一多很麻烦.它,就是来解决这个问题的.一个注解全 ...
- 【小白技术笔记】保存皮皮虾APP无水印视频到手机相册,只需要三步 [技术干货]
百万段友回皮皮虾,转身一变,都成了皮友.作为当年的资深段友,今天的皮友的我.看到好视频,经典视频,搞笑视频,就想保存一份到手机相册,然后皮皮虾啊皮皮虾,有个让人很讨厌的地方,保存视频的时候就有皮皮虾的 ...
- json遍历 分别使用【原】
json遍历 一 使用org.json.JSONObject遍历 之后的所有遍历都参考了:http://blog.csdn.net/u010648555/article/details/4981538 ...
obj.mk
OBJECTS += ./obj/uart.o
方法七、
把所有头文件都放在include目录下
CC=arm-none-linux-gnueabi-gcc
INCLUDDIR=-I include
OBJDIR=obj
TEST_RES := bin/regDebug
OBJECTS = $(OBJDIR)/main.o
-include ./package/obj.mk
$(OBJDIR)/%.o:%.c
$(CC) $(INCLUDDIR) -c $< -o $@
$(OBJDIR)/%.o:./package/%.c
$(CC) $(INCLUDDIR) -c $< -o $@
$(TEST_RES): $(OBJECTS)
$(CC) $^ -o $@
.PHONY: clean
clean:
#CC=arm-none-linux-gnueabi-gcc
#INCLUDDIR=-I include
#OBJDIR=obj
-include rules.mk
TEST_RES := bin/regDebug
OBJECTS = $(OBJDIR)/main.o
-include ./package/obj.mk
$(OBJDIR)/%.o:%.c
$(CC) $(INCLUDDIR) -c $< -o $@
$(OBJDIR)/%.o:./package/%.c
$(CC) $(INCLUDDIR) -c $< -o $@
$(TEST_RES): $(OBJECTS)
$(CC) $^ -o $@
.PHONY: clean
clean: