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. 【BZOJ1558】等差数列(线段树)

    [BZOJ1558]等差数列(线段树) 题面 BZOJ 题解 可以说这道题已经非常毒瘤了 怎么考虑询问操作? 如果直接将一段数分解为等差数列? 太麻烦了.... 考虑相邻的数做差, 这样等差数列变为了 ...

  2. C++ 虚函数表解析 继承

    C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父 ...

  3. c++纯虚函数在父类中调用的规避

    构造和析构函数不允许调用纯虚函数,可以先调用虚函数,里面再调用纯虚函数实现. class Base{public:    virtual void foo()=0;    Base() { call_ ...

  4. 从C,C++,JAVA和C#来看String库的发展(二)---JAVA和C#篇

    http://www.cnblogs.com/wenjiang/p/3272859.html 终于要进入面向对象的世界了,虽然C++也是面向对象,但是它的面向对象程度并不高,因为考虑到要兼容C语言的移 ...

  5. USACO Section 1.1

    这是4道大水题. 因为我看有些题解写的很丑陋,就把我的代码发上来. 第一题是我早期作品,丑陋不堪...... #include <cstdio> #include <iostream ...

  6. java后端面试

    背景:最近在找工作,但是发现每次找的时候都需要整理一些基础知识,这些点又是面试过程中经常被问到的,每次都进行整理很麻烦,所以有打算好好总结下. 转载自:https://www.cnblogs.com/ ...

  7. win10下通过Anaconda安装TensorFlow-GPU1.3版本,并配置pycharm运行Mnist手写识别程序

    折腾了一天半终于装好了win10下的TensorFlow-GPU版,在这里做个记录. 准备安装包: visual studio 2015: Anaconda3-4.2.0-Windows-x86_64 ...

  8. 发送邮件时Unable to relay错误的解决方法 转

    使用python的smtplib发送邮件,使用新浪的smtp服务,在本地测试正常.但把程序部署到服务器后,却连不上新浪的smtp服务器,可以ping通,但telnet 25端口失败,导致程序无法正常运 ...

  9. MUI 样式按钮的禁用

    1)如果是button,input等标签,可以     .attr("disabled",true)或者.attr("disabled","disab ...

  10. MySQL5.5登录密码忘记了,怎嘛办?

    1.关闭正在运行的MySQL. 2.打开DOS窗口,转到mysql\bin目录. 3.输入mysqld --skip-grant-    tables回车.如果没有出现提示信息,那就对了. 4.再开一 ...