Makefile笔记

Makefile 笔记

一、简单的 Makefile 例子

  1. 文档目录结构
    • 文档目录结构是用户目录HOME下有src incl bin lib
      src:源码
      incl:头文件
      bin:执行码
      lib:静态/动态库
      这是大家最常见的Linux编程目录结构,以下代码编译都是依据这个结构。
      
  2. Makefile 代码
    hello:hello.c
        gcc -I${HOME}/incl -c hello.c   // 预处理+编译+汇编命令 不汇编
        gcc -o hello hello.o    
        rm -f hell.o
        mv hello ${HOME}/bin
    
    • 简单的Makefile确实可以当shell脚本执行,但是只学会简单的Makefile并看不懂大神的Makefile啊

二、Makefile 结构说明

  • Makefile里主要包含了五个东西:变量定义、显式规则、隐晦规则、文件指示和注释。
  1. 变量定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
  2. 显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。 刚才写的疑似shell脚本的Makefile全部都是显示规则。
  3. 隐晦规则。由于我们的 make 有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写 Makefile,这是由make所支持的。
    4.文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样。
  4. 注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。

三、略复杂的 Makefile 例子

  1. Makefile 代码
    # 隐含规则:这个隐晦规则其实就是告诉大家,后缀为cpp的文件怎么编译成.o,后缀为c的文件怎么编译成.o。
    INCL=-I${HOME}/incl             # 变量定义
    
    .SUFFIXES: .cpp .c
    .cpp.o:
        g++ ${INCl} -c $<           # ${INCl} 进行了变量使用
    
    .c.o:
        gcc ${INCL} -c %<           # %< 是预定义变量
    
    # C++编译
    hellocpp:hellocpp.o
        echo "开始编译"
        g++ -o hellocpp hellocpp.o
        rm -f hellocoo.o 
        mv hellocpp ${HOME}/bin
        echo "编译结束"
    
    # C编译
    hello:hello.o
        echo "开始编译"
        gcc -o hello hello.o
        rm -f hello.o
        mv hello ${HOME}/bin
        echo "编译结束"
    
  2. 预定义变量
    $*    不包含扩展名的目标文件名称。
    $+    所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
    $<    第一个依赖文件的名称。
    $?    所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
    $@     目标的完整名称。
    $^    所有的依赖文件,以空格分开,不包含重复的依赖文件。
    $%      如果目标是归档成员,则该变量表示目标的归档成员名称。
    
  3. 进一步理解预定义变量
    • Makefile文件
      all: first second third
          @echo "\$$@ => $@"
          @echo "$$^ => $^"       # "$"对于makefile有特殊含义输出时需要加上一个"$"进行转义
          @echo "$$< => $<"       # "$@"对于Bash Shell有特殊含义输出时需要加上"\"进行转义
      
    • 执行后
      $@ => all
      $^ => first second third
      $< => first
      

四、整理下三中 Makefile 例子

  1. 最后形成的 Makefile 例子
    #最后形成的Makefile
    INCL=-I${HOME}/incl
    BIN=$(HOME)/bin
    OBJ1=hellocpp.o
    OBJ2=hello.o
    
    .SUFFIXES: .cpp .c
    .cpp.o:
        g++ ${INCL} -c $<
    
    .c.o:
        gcc ${INCL} -c $<
    
    all: hellocpp hello
    
    #C++编译
    hellocpp:${OBJ1}
        @echo "============开始编译============"
        g++ -o $@ $?
        @rm -f ${OBJ1}
        @mv $@ ${BIN}
        @echo "============编译结束============"
        @echo ""
    
    #C编译
    hello:${OBJ2}
        @echo "============开始编译============"
        gcc -o $@ $?
        @rm -f ${OBJ2}
        @mv $@ ${BIN}
        @echo "============编译结束============"
        @echo ""
    
  2. 命令前加@,表示当前命令不显示
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容