手把手教你写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 ...
随机推荐
- 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为开 ...
- hdu 2158 最短区间版大家来找碴(尺取法)
Problem Description 给定一个序列,有N个整数,数值范围为[0,N).有M个询问,每次询问给定Q个整数,可能出现重复值.要求找出一个最短区间,该区间要包含这Q个整数数值.你能找的出来 ...
- oh-my-zsh的安装与基本配置
1. 准备工作 安装需要用到:wget curl git zsh 官网:http://ohmyz.sh/ GitHub主页:https://github.com/robbyrussell/oh-my- ...
- 在Vue中如何使用axios跨域访问数据(转)
最近在项目中需要用到axios,所以就恶补一下这个axios到底是什么东东.越来它是vue-resource的替代品,官网也说了,以后都用axios, vue-resource不在维护.那么这个axi ...
- springboot整合activiMQ
首先说明: 队列queue 的特点就是,许多人可以监听它,但是只有一个人能够收到消息. 主题topic 的特点就是,许多人监听它,都能收到消息. 需要安装activiMQ在自己的电脑上.启动方 ...
- CSS实现文字竖排排版
CSS实现文字竖排 注意: writing-mode: vertical-rl;存在兼容性问题,在IE上正常,在谷歌的低版本上可能识别不了. 如果文字少的话考虑直接在每一个文字中间加一个<br& ...
- WebSocket实战之——JavaScript例子
一.详细代码案例 详细解读一个简单html5 WebSocket的Js实例教程,附带完整的javascript websocket实例源码,以及实例代码效果演示页面,并对本实例的核心代码进行了深入解读 ...
- python执行centos命令
import os improt sys import re import commands a = commands.getoutput("ls -al /") print a
- springboot(八)自定义Filter、自定义Property
自定义Filter 我们常常在项目中会使用filters用于录调用日志.排除有XSS威胁的字符.执行权限验证等等. Spring Boot自动添加了OrderedCharacterEncodingFi ...
- 第16月第25天 tableView设置UITableViewStyleGrouped顶部有空余高度
1. 正确的处理方法 1)设置标头的高度为特小值 (不能为零 为零的话苹果会取默认值就无法消除头部间距了) UIView *view = [[UIView alloc]initWithFrame:CG ...