MakeFile Implicit Rules,A Gift for Me(强大的MAKEFILE)!!!

IPC-7351标准实战:如何用LPWizard_10快速生成PCB封装库(附避坑指南) 本文提供了一份详细的IPC-7351标准实战指南,手把手教你使用LPWizard_10软件快速生成符合行业标准的PCB封装库,并直接导入Cadence Allegro。文章深入解读了IPC-7351密度等级的选择逻辑,并重点分享了软件配置、QFN封装生成实战步骤,以及导出失败、焊盘异常等常见问题的避坑解决方案,旨在帮助硬件工程师提升设计效率和可靠性。 阅读详情
MakeFile Implicit Rules,A Gift for Me(强大的MAKEFILE)!!!


  这几天在解决源代码编译时忽然遇到个问题,今天终于在网络上学习MAKEFILE资料后得到解决,在此与大家分享。
  使用GCC开发的朋友是不是会常写MakeFile呀,一般来说COPY一个已经有的MakeFile,改一改加入
自己的CFLAGS和OBJECTS就好了,其中有几行处理OBJECT编译的suffix rule:
.c.o:
$(CC) -c $(CFLAGS) -o $*.o $<
.S.o:
$(CC) -c $(CFLAGS) -o $*.o $<

它会根据.o目标的依赖自动找到对应的.c进行编译,所以的objects使用相同的CFLAGS,平常这没有什么问题,可是如果其中有部分objects需要使用与众不同的CFLAGS定义怎么办呢?

比如我的程序三个.c文件main.c,meth_a.c,meth_b.c,他们使用到一个DEBUG的宏来在MAKEFILE中定义用来打开 debug信息,可是我现在只希望打开meth_b.c中的debug信息怎么办呢,MakeFile的隐式规则可以帮助你办到!

CFLAGS += -Wall
CFLAGS += -O2
CFLAGS += -ansi
CFLAGS += -I/usr/include


meth_b.o : CFLAGS += -DDEBUG

只要加入meth_b.o : CFLAGS += -DDEBUG就好了,它表示在编译目标时CFLAGS自动加上-DDEBUG的宏定义,厉害,强大的MakeFile!!!

以下是参考文章转载:
http://www.study-area.org/cyril/opentools/opentools/x1176.html

內隱規則(Implicit Rules)

簡介

通常我們編譯程式時有很多算是每個人都有的共同習慣,例如我就是把 foo.c 編成foo.o。像這樣的編譯習慣,gnu make有一些內定規則來編譯, 也就是有的target你不寫,make也可以根據內定規則把他編譯出來。不用 對每個不同的.o寫不同的規則, 如果有個程式由foo.c foo1.c foo2.c......寫這些就寫得會發瘋了,例如

foo.o:foo.c
gcc -c -o foo.o foo.c
foo1.o:foo1.c
gcc -c -o foo1.o foo1.c
....
因此 如果你不寫foo.o的規則,那麼make當別的規則用到foo.o時,他找不到規則 來編,就會自動找foo.c來編譯。這樣看不到的編譯規則有很多,如
C程式
$(CC) -c $(CPPFLAGS) $(CFLAGS) xxx.c來編譯
或者找不到.c時會去找.cc, .cpp, .C檔

C++程式
$(CXX) -c $(CPPFLAGS) xxx.cpp

TeX
xxx.dvi 由xxx.tex產生

Pascal
$(PC) -c $(PFLAGS) xxx.p

自己的內隱規則

因為可能有的時候你希望做些dependency檢查,或者加上一些gcc 用的旗標,不是很單純的編譯而已你可以給make自訂的內隱規則

自訂規則

樣式規則(pattern rule)

你可以用pattern rule來做一些自定的內隱規則。像這樣

%.o : %.c prog.h
$(CC) $(CFLAGS) $(DEBUG_FLAG) -c -o $@ $<
或者
%.pdf : %.sgml
db2pdf $<
%表示所有相對於後面先決條件的檔名的意思,他不是*,因為他 有一對一的相對應關係,foo.o 就要找foo.c,foo1.o就要找foo1.c, 所以他不是*。所以上面的意思是所有碰到要.o的target時,去找相 對應的.c檔,並根據先決條件prog.h做檢查,如果找不到prog.h就不 做下去了。%不只可以表現主檔名,其實可以表現任一個相對應的字串, 所以叫pattern,你可以用s.%.c,不只用&.c,其中對應到%的子字 串叫stem。另外$@ $<...這種符號,叫自動變數,請往後翻一下, 看一下解說。

pattern rule也可以有特定變數設值,特定樣式(pattern)的變數,例如

%.o : CFLAGS = -O
表示只要有要編譯xxxx.o的規則時,通通要設CFLAGS為-O。

副檔名規則

還有更古老的一種叫suffix rule的方法來做,這種方法就有限制性 了,因為只能用在副檔名的規則。例如

.c.o:
$(CC) -c -o $*.o $<
.S.o:
$(CC) -c -o $*.o $<
小心喔,跟%o : %c順序不一樣喔

自動變數與內隱規則

因為這樣動態的編譯手法,它需要像在CVS裡面的%v %V %s這種東西來代替一些 動態改變的字串(幫你複習一下CVS)。所以有所謂的自動變數

$@	同一個規則的目標名
$* 這個只有在內隱規則中有用。表示樣式或副檔名規則中對應到的字串。
$< 同一規則的第一個先決條件名,這個大部分用在suffix rule,因為
suffix rule只有一個檔。
$? 同一個規則的所有先決條件名,但是只有原始程式碼改過的比obj檔新才會
符合,也就是比target還新的先決條件檔案。
$^ 所有先決條件,但是有的make像solaris make可能不認得這個自動變數。
上面是比較常用的

內隱規則內也預設了一些變數,例如

AR = ar
CC = cc
MAKE = make
CXX = g++
如果你沒有設CC這個變數,則自動是cc這個值,可以直接拿$(CC)來用。 自定內隱規則可以寫在任何地方,make會自動先找到他們,等到要用時就會 去用。通常在一些系統上例如Solaris, AIX...已經有Sun IBM的make了, 所以系統管理者通常會把GNU make叫gmake,這時可以設MAKE = gmake。



Qt/C++编写自定义控件42-开关按钮 一、前言 从2010年进入互联网+智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ、360卫士、金山毒霸等,都有很多开关控制一些操作,在Qt widgets应用项目上,在项目中应用些类似的开关按钮,估计也会为项目增添不少新鲜感。 总结了大部分的开关按钮控件,基本上有两大类,第一类是纯代码绘制,这种对代码的掌控度要求比较高,但是灵活性比较好... 阅读详情

相关推荐

遗传算法优化反向传播神经网络Matlab代码.rar

遗传算法优化反向传播神经网络Matlab代码.rar

Makefile 的规则

1596年到1598年,一个有名的人叫巴伦支,他是荷兰的一个船长,他试图找到从北面到达亚洲的路线。他经过了三文雅,现在一个俄罗斯的岛屿,但是他们被冰封的海面困住了。 三文雅地处北极圈之内,巴伦支船长和17名荷兰水手在这里度过了8个月的漫长冬季。他们拆掉了船上的甲板做燃料,以便在零下40度的严寒中保持体温;他们靠打猎来取得勉强维持生存的衣服和食物。在这样恶劣的险境中,8个人死去了。但荷兰商人却做了一

Michael J.的专栏 473

基于深度学习的电力负荷预测研究Python源码+文档说明

基于深度学习的电力负荷预测研究Python源码+文档说明,该项目是个人毕设项目,答辩评审分达到98分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。基于深度学习的电力负荷预测研究Python源码+文档说明基于深度学习的电力负荷预测研究Python源码+文档说明基于深度学习的电力负荷预测研究Python源码+文档说明基于深度学习的电力负荷预测研究Python源码+文档说明基于深度学习的电力负荷预测研究Python源码+文档说明基于深度学习的电力负荷预测研究Python源码+文档说明基于深度学习的电力负荷预测研究Python源码+文档说明基于深度学习的电力负荷预测研究Python源码+文档说明基于深度学习的电力负荷预测研究Python源码+文档说明基于深度学习的电力负荷预测研究Python源码+文档说明基于深度学习的电力负荷预测研究Python源码。

How to write a Makefile

How to write a Makefile17:32:18IntroductionMake is one of the original Unix tools for Software Engineering. By S.I. Feldman of AT&T Bell Labs circa 1975. But there are public domain ve

green2的专栏 985

从头开始写项目Makefile(二):隐含规则自动推导

原文链接:添加链接描述 上一节的Makefile勉强可用,但还写的比较繁琐,不够简洁。对每一个.c源文件,都需要写一个生成其对应的.o目标文件的规则,如果有几百个或上千个源文件,都手动来写,还不是很麻烦,这也不够自动化啊。 这样,我们把生成.o目标文件的规则全部删除掉,就是这样一个Makefile文件: target_bin : main.o debug.o ipc.o timer.o tools.o —gcc -o target_bin main.o debug.o ipc.o timer.o tool

qq_43248127的博客 311

Linux下C++的通用Makefile与解析

http://graybull.is-programmer.com/posts/37758.html 本文给出万能Makefile的具体实现,以及对其中的关键点进行解析。 号称万能Makefile,一统江湖。我对原版的Makefile做了些修改。首先揭开它的庐山真面目: #################################################### #

Hello World! 933

Make的 built-in(implicit) rules

下面的内容可以使用命令  make  --print-data-base 得到。 %.o : %.c #command to execute $(COMPILE.c) $(OUTPUT_OPTION) $< %:%.c $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@ %:%.o $(LINK.o) $^ $

小猪爱拱地 1017

MakeFile入门详解

makefile很重要       什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写make

细心程度决定你的成败 4592

gnu make 手册 学习笔记 C语言 / C++ 构建工具 part.4 Pattern rule 隐式规则 implicit rule

3-3.Pattern rule 有Implicit Rules/隐私规则,和过时的后缀规则。主要是为了方便使用。 可以使用 make -p 来显示默认的规则,当然也可以使用配置文件覆盖规则。 简单的C语言编译的隐含规则。 如果prerequires没有找到对应的target,或者文件,会使用pattern rule来进行模式匹配, 如果匹配上的话,使用pattern rule定义的规则,做出t...

lijinken的博客 562

makefile——rule概览

1.makefile 的组成及作用 makefile由一组rule(规则)组成,规则的语法如下: obj1 obj2 objN: prerequisite1 prerequisite2 prerequisite3 prerequisiteN (tab) commands 一个规则由三部分组成 obj 即目标部分。 必要条件部分(或者说依赖,即生成目标文件的依赖文件)。 commands 从必要条件生成obj 需要执行的 命令。 这一组规则会生成一个叫dependency graph 的东西,可以翻译成

江南又一春 958

MakeFile _10.3 Variables Used by Implicit Rules

10.3 Variables Used by Implicit Rules(潜规则。哈哈)The commands in built-in implicit rules make liberal use of certain predefined variables. You can alter the values of these variables in the makefile, wi

Easiny 650

make简介

本系列文章均翻译自make官方文档:make Manual,github同步项目:question make指明了一个大程序的哪一部分需要重新构建,然后发出命令来重新编译它们。 Makefile介绍 Makefile文件告诉make如何编译和链接一个程序。 规则介绍 rule模型 target … : prerequisites … recipe … ...

ignorantshr的博客 399

GNU make 指南

GNU make 指南 蓝森林 http://www.lslnet.com 2000年8月10日 10:56作 者: 哈少译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握了 make 的用法。而 make 是所有想在 Unix (当然也包括 Linux )系统上编程的用户必须掌握的工具。如果你写的程序中没有用到 make ,则说明你写的程序只是个人的练习程

qiup的书斋 1072

Makefile常用调试方法

Makefile常用调试方法     转载自 陈皓《跟我一起写 Makefile》《GNU Make项目管理》   GNU make 提供了若干可以协助调试的内置函数以及命令行选项。 1、warning函数 $(warning string)函数可以放在makefile 中的任何地方,执行到该函数时,会将string输出,方便定位make执行到哪个位置。warning函数

wdjjwb的专栏 2179

Makefile‘混和的隐含和普通规则’错误的解决

工作环境: fedora14 目标平台:s3c2440 开发包内核源码目录:/home/linux-2.6.24-5801 开发包内核版本:2.6.24 交叉编译工具:gcc-3.4.1 用gcc-3.4.6交叉编译3210内核,执行make命令,会提示"*** 混和的隐含和普通规则。 停止。"的错误。这是由于fedora14的Make工具对低版本内核Makefile一些旧的规则兼容不是

咕唧咕唧shubo.lk的专栏 6816

(转)make的常见错误信息

(转)make的常见错误信息 make执行过程中所产生错误并不都是致命的;特别是在命令行之前存在“-”、或者make使用“-k”选项执行时。make执行过程的致命错误都带有前缀字符串“***”。错误信息都有前缀,一种是执行程序名作为错误前缀(通常是“make”);另外一种是当Makefile本身存在语法错误无法被make解析并执行时,前缀包含了make

活到老、学到老 3049

make 的隐含规则和隐含变量

隐含规则和隐含变量可以通过make -p -f /dev/null 查看。  # Variables # automatic # automatic ?F = $(notdir $?) # default CWEAVE = cweave # automatic ?D = $(patsubst %/,%,$(dir $?)) # automatic @D = $(patsubst %/,%,$(dir $@)) # automatic @F = $(notdir $@) # makefile CURDIR :

Hansel的专栏 2059

跟我一起写 Makefile(十一)

make 的运行——————一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想在不同的时候使用不同的编译规则,等等。本章节就是讲述如何使用make命令的。一、make的退出码make命令执行后有三个退出码:    0 —

陈皓专栏 【空谷幽兰,心如皓月】 3万+

编译2.6.XXX内核,出现Makefile:1449: *** mixed implicit and normal rules. Stop.解决方案

在编译内核的时候提示Makefile:1449: *** mixed implicit and normal rules. Stop. 在网上查找后得到如下原因: 是由于我的系统的make工具太新(系统:fedora16),make的旧版规则已经无法兼容新版。按照以下方式,问题得到解决: 修改前:41...

manyouxianfeng的专栏 378

makefile编译提示“混合的隐含和普通规则”错误解决

问题描述:执行make menuconfig命令的时候,提示Makefile:421: *** 混和的隐含和普通规则。 停止。由于高版本make对Makefile的一些旧规则兼 容不是很好,只需要修改Makefile文件即可。 解决流程: 1. 修改   config %config: scripts_basic outputmakefile FORC...

zouli415的博客 2064

全自动纸箱包装机.rar

全自动纸箱包装机.rar

上一篇: A Sky Angel
下一篇: Makefile学习教程
hcllm
博客等级 码龄24年 0粉丝 11原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值