zoukankan      html  css  js  c++  java
  • Makefile — 基础

    参考: 跟我一起写 Makefile

                GNU make

              《GNU+Make项目管理(第三版)》

    1.Makefile用途

        使用GNU Make工具来管理程序是每个Linux工程师必须掌握的技能。Make能够使整个程序的编译、链接只需要一个命令(make)就可以完成。

        Make的工作主要依赖于一个叫为Makefile的文件。Makefile文件描述了整个程序的编译,连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译,如何最后产生我们想要得可执行文件。

    2.Makefile构成

    2.1 Makefile构成-规则

    Makefile中最重要的组成部分是“规则”

    规则:用于说明如何生成目标文件,规则的格式如下:

    targets : prerequisites

                   command

    目标 依赖

    [Tab] 命令(可以有多条)

    特别注意:命令行前需要使用【TAB】键空格,一条规则里目标只有一个,依赖和命令可以有多个

    例子:

    led.elf: led.o

        arm-linux-ld -Tled.lds -o led.elf led.o

     

    2.2 Makefile构成-伪目标

    Makefile中把那些只包含命令,没有任何依赖目标称为伪目标(phony targets).

    .PHONY : clean

    clean :

        rm f hello main.o func.o

    .PHONYclean目标声明为伪目标

     

    2.3 Makefile构成-最终目标

    1.当一个makefile中有多条规则时,如何单独执行某条规则?

       make + 你想得到的目标,make默认执行第一条规则

          clip_image002

    2. 如果用户没有指定执行某一条规则,直接运行make命令会默认执行makefile中的1条规则,而这条规则中的目标称之为:最终目标

           clip_image004

           clip_image006

    clean通常是用来清除一些我们产生的中间文件:

           clip_image008

    2.4 Makefile规则-变量 (简化Makefile)

    使用变量前:

    app1: app1.o func1.o func2.o

        gcc app1.o func1.o func2.o -o app1

    app2: app2.o func1.o func2.o

        gcc app2.o func1.o func2.o -o app2

    使用变量后:

    obj=func1.o func2.o (变量赋值没有空格)

    app1: app1.o $(obj) (引用变量:$(obj)

        gcc app1.o $(obj) -o app1

    app2: app2.o $(obj)

        gcc app2.o $(obj) -o app2

    注:在一个Makefile中多出出现的组成部分,可以使用变量来替换;在Makefile中变量是没有类型的。

    makefile中,用户除了可以自己定义变量外,还可以直接使用系统已经定义好的默认变量:

        $<:代表第一个依赖文件

        $^代表所有的依赖文件

        $@:代表目标集合

        % :模式匹配符(%.o表示当前目录下的所有.o文件)

    使用前:

    clip_image010

    led.o : led.S

        arm-linux-gcc -g o led.o -c led.S

    使用后:

    clip_image012

    led.o : led.S

        arm-linux-gcc -g o $@ -c $^

     

    2.5 Makefile构成-通用规则

    当一个makefile中有许多类似的规则时,如何将这些规则合并为一条通用规则?

        当目标的名字依赖的名字仅仅是后缀不一样,如下图:

    clip_image014

    我们可以用%修改;%表示任意的名字

    clip_image016

    注:Makefile中“#字符后的内容被视作注释。

     

    3.Makefile使用技巧

    3.1 使用技巧-使用伪目标指令烧写程序到sd卡

    clip_image018

    3.2 使用技巧-去回显(在编译大源代码的时候非常有用,回显占用编译时间)

    hello: hello.c

        @gcc hello.c o hello

    在命令前面加@:取消回显

    clip_image020

    3.3 使用技巧-文件名

    make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:make f 文件名

    clip_image022

  • 相关阅读:
    数据库备份脚本
    redismyadmin安装(支持redis4 集群模式)
    elasticsearch ik安装
    centos7.2 +cloudstack 4.11 +KVM +ceph 安装配置(网卡带聚合)
    cloudstack4.11+KVM+4网卡bond5+briage 交换机不作配置
    web service:AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
    根据WSDL生成客户端代码(XFire)
    Apache axis2 + Eclipse 开发 WebService
    The processing instruction target matching "[xX][mM][lL]" is not allowed.
    使用dom4j解析xml文件,并封装为javabean对象
  • 原文地址:https://www.cnblogs.com/LoTGu/p/5905067.html
Copyright © 2011-2022 走看看