make命令和makefile文件

make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具,它不仅常被用于控制源代码的编译,而且还用于手册页的编写以及将应用程序安装到目标目录。makefile文件由一组依赖关系

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

  make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具,它不仅常被用于控制源代码的编译,而且还用于手册页的编写以及将应用程序安装到目标目录。

  makefile文件由一组依赖关系和规则构成,每个依赖关系由一个目标和一组该目标所依赖的源文件组成,而规则描述了如何通过这些依赖文件创建目标,一般来说,目标是一个单独的可执行文件。

1. make命令的选项和参数

  make程序本身有许多选项,其中最常用的三个选项如下所示:

(1)-k:让make命令在发现错误时仍然继续执行

(2)-n:让make命令输出将要执行的操作步骤,而不真正执行这些操作

(3)-f <filename>:告诉male命令将哪个文件作为makefile文件

1.1 依赖关系

myapp: main.o 2.o 3.o 
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h

  依赖关系定义了最终应用程序里的每个文件和源文件之间的关系

  如果想一次创建多个文件,可以利用伪目标all

all:    myapp    myapp.1

  建议约定:在自己的makefile文件中将第一个目标定为all,然后再列出其它重属目标

1.2 规则

  makefile文件中一个非常奇怪而又令人遗憾的语法现象:空格和制表符是有区别的,规则所在的行必须以制表符开头,用空格是不行的,如果makefile文件中的某行以空格结尾,也可能导致make命令执行失败。

myapp: main.o 2.o 3.o
    gcc -o myapp main.o 2.o 3.o
main.o: main.c a.h
    gcc -c main.c 
2.o: 2.c a.h b.h
    gcc -c 2.c
3.o: 3.c b.h c.h 
    gcc -c 3.c

1.3 makefile文件中的宏

  为了让makefile文件在面对大项目时不至于过于庞大和缺乏弹性,makefile文件允许使用宏以一种更通用的格式来书写它们

  MACRONAME = value

  $(MACRONAME)或${MACRONAME}或$MACRONAME

  若要定义一个值为空的宏,可以MACRONAME = 

  宏通常都是在makefile中定义的,但也可以在调用make命令时在命令行上给出宏定义,例如male CC=c89.命令行上的宏定义将覆盖makefile中的宏定义。

all: myapp 

#which compier
CC = gcc

#where are include files kept
INCLUDE = 

#options for development
CFLAGS =  -g -Wall -ansi

#options for release
#CFLAGS = -0 -Wall -ansi

myapp: main.o 2.o 3.o
    $(CC) -o myapp main.o 2.o 3.o
main.o: main.c a.h
    $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
2.o: 2.c a.h b.h 
     $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
     $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

  ”-g” 是 gcc 的选项, “-o”也是 gcc 的选项。前者指示加入调试信息,后者指示对代码进行优化。

   gcc 的-Wall 选项可以打印出编译时所有的错误或者警告信息

1.3.1 make命令内置的特殊宏

  $?   当前目标所依赖的文件列表中比当前目标文件还要新的文件

  $@  当前的目标的名字

  $<   当前规则的第一个依赖文件

  $^   当前规则的所有依赖文件,以逗号分隔

  $*   不包括后缀名的当前依赖文件的名字

  -     告诉make命令忽略所有的错误

  @   告诉make在执行命令前不要将该命令显示在标准输出上@echo

  $(@D) 目标文件的目录名部分

  $(@F) 目标文件的文件名部分

1.3.2 多个目标

all: myapp 

#which compier
CC = gcc

#where to install
INSTDIR = /usr/local/bin

#where are include files kept
INCLUDE = 

#options for development
CFLAGS =  -g -Wall -ansi

#options for release
#CFLAGS = -0 -Wall -ansi

myapp: main.o 2.o 3.o
    $(CC) -o myapp main.o 2.o 3.o
main.o: main.c a.h
    $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
2.o: 2.c a.h b.h 
     $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
     $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

clean:
    -rm main.o 2.o 3.o 

install:myapp
    @if [-d $(INSTDIR)]; \
        then \
        cp myapp $(INSTDIR) &&\
        chmod a+x $(INSTDIR)/myapp && \
        chmod og-w $(INSTDIR)/myapp;\
    else \
        echo "Sorry,$(INSTDIR) does not exist";\
    fi

  clean:删除不需要的目标文件,由于clean:的后面是空的,因此该目标总被认为是过时,所以在执行make命令时,如果指定目标clean,则目标所对应的规则将总被执行

  install:将编译成功的应用程序安装到另一个目录下

  -rm:rm命令以减号开头是让make命令忽略rm命令的执行结果

1.4 内置规则

  可以通过make -p来打印make的所有内置规则,比如:

OUTPUT_OPTION=-o ¥@
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
%.o: %.c
    $(CONPILE.c) $(OUTPUT_OPTION) $<

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120121.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 验证码的作用及原理

    验证码的作用及原理验证码的发展历程从互联网诞生前期,互联网是没有验证码的。在论坛博客上发帖子,只要敲一下回车键按“发表”就可以了。然而,有白客就有黑客,随着计算机程序的愈发发展,黑客十分猖狂。他们编写了一种能够大量、重复编写信息的程序,伪装成人类用户,肆无忌惮的在网络上倾倒大量的、无意义的“僵尸”信息,垃圾邮件、垃圾广告、垃圾评论到处飞。更编写了模仿登录、恶意激活成功教程代码、刷票等恶意程序。这严重影响了互联网的正常运行,导致体验效果很差。以受影响最大的电子邮件的提供商为例:用户每天收到数以千计的垃圾邮件,严重影响工作效率。.

    2022年7月14日
    18
  • NASM汇编_nasm标准

    NASM汇编_nasm标准操作指令MOV  dst,src 把src的内容复制到dst中,操作字长由参数字长决定push   把参数入栈pop     从栈顶弹出数据,存入给定参数中PUSHA把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.(在不同模式下面,对应不同的寄存器,如32bit模式,对应32位寄存器)POPA   把DI,SI,BP,SP,BX,DX,C

    2022年8月30日
    1
  • 商业银行业务架构图模板_我国商业银行组织架构

    商业银行业务架构图模板_我国商业银行组织架构 

    2022年10月12日
    2
  • java正则表达式验证手机号码_java邮箱判断合法正则表达式

    java正则表达式验证手机号码_java邮箱判断合法正则表达式java手机号正则表达式目前是截止2019年6月最新,适配各种手机号,满足常见号码验证importjava.util.regex.Matcher;importjava.util.regex.Pattern;importorg.apache.commons.lang3.StringUtils;/***@authorkpzc*三大运营商号码均可验证(不含卫星通信1349)*/publicclassmobile{/*<br>     2019

    2022年9月17日
    2
  • Android原生系统真的那么好用吗?安卓原生系统吊打其他系统,因为有Google-Play

    Android原生系统真的那么好用吗?安卓原生系统吊打其他系统,因为有Google-PlayAndroid原生系统真的那么好用吗?这种问题当然是否定的。原生Android(指的是直接基于AOSP构建的而非手机厂商出厂固件修改的第三方ROM,但包括Nexus/Pixel或其它被Google直接支持的手机的可能是闭源的出厂固件)对于适合的人而言是无可替代的,当前几乎无任何定制ROM就与之相比。但是对于更多的中国用户而言,他们从一开始就使用的是定制系统,已经习惯了那一套逻辑和对系统的认知,所以定制系统是更好的选择(但您们最好祈祷一下手机厂商的ROM不要越来越不要脸)。当然.

    2022年6月19日
    82
  • 一步一步来:MQTT服务器搭建、MQTT客户端使用

    一步一步来:MQTT服务器搭建、MQTT客户端使用物联网应用如火如荼,本文就物联网应用中最受青睐的协议MQTT相关测试工具的使用进行简单说明。希望此文能给需要用到的朋友一些微薄的帮助……一、MQTT服务器(emqx)搭建1.下载服务器MQTTBroker从https://www.emqx.io/cn/mqtt/public-mqtt5-broker下载MQTTBroker。这里我使用的windows系统,下载对应版本工具:emqx-windows-v4.1-rc.2.zip下载好后,解压目…

    2022年6月5日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号