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【原创】的更多相关文章

  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. 洛谷 P2491消防 解题报告

    P2491 消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个 ...

  2. [WF2012]infiltration

    [WF2012]infiltration 完全图 最多选择logn个点(下取整)(每选择一个点覆盖至少一半的规模) 暴力O(75^5)(不严格)枚举+bitset (随机化也可过) #include& ...

  3. 【LOJ#6278】数列分块2

    题目大意:分块维护一个有 n 个数字的序列,有两种操作:区间加,区间查询小于某个数的元素个数.n <= 50000 预处理阶段:处理出块内元素的相对大小顺序(排序),时间复杂度为 \(O(nlo ...

  4. CodeBlocks: 生成的exe文件自定义一个图标

    CodeBlocks生成的exe文件的图标默认是系统图标,如何自定义一个漂亮的小图标呢? 我是C菜鸟,平时只用CodeBlocks练习c,也不开发什么软件,这个问题就难倒我了. 到网上搜索了一下,发现 ...

  5. 关于:HTTP Header -> Content-Type: text/plain Cache-Control: no-cache IE浏览器弹出错误下载对话

    下午遇到一个很奇怪的现象,一个网址: http://192.168.1.3/login?action=a&fr=b.com 注意网址后面的参数形式,action参数在前,最后一个参数值的尾部含 ...

  6. BCD码(如何转换,转换方式的证明)

    1. 十进制转2421码:小于4不考虑使用最高位,从最高位向最低位依次相减. 如3=2+1,为0011:7=2+4+1,为1101 2. 十进制5211码:按照最高位,次高位,最低位,次低位的顺序依次 ...

  7. 洛谷 P1083 借教室

    传送门:Probem 1083 https://www.cnblogs.com/violet-acmer/p/9721160.html 一.暴力简述 首先我们不难看出,这道题--并不是一道多难的题,因 ...

  8. vue-devtools chrome 开发工具

    1.github下载地址:https://github.com/vuejs/vue-devtools 有Git的同学直接 Git clone https://github.com/vuejs/vue- ...

  9. 九、java容器

    目录 一.容器的概念 二.Cpllection接口 三.Iterator接口 四.增强的for循环 五.Set接口 六.List接口和Comparable接口 八.Map接口 九.自动打包/解包 十. ...

  10. 漏洞评估工具Nexpose的配置使用

    nexpose是领先的漏洞评估工具之一.Nexpose社区版是一个免费的程序,其他版本是收费的.在这篇文章中,我们将使用Nexpose免费社区版,里面有扫描32主机的能力.用户界面干净.报告强大.像大 ...