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

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

1. make命令的选项和参数

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

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

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

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

1.1 依赖关系

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

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

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

all:    myapp    myapp.

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

1.2 规则

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

myapp: main.o .o .o
gcc -o myapp main.o .o .o
main.o: main.c a.h
gcc -c main.c
.o: .c a.h b.h
gcc -c .c
.o: .c b.h c.h
gcc -c .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 = - -Wall -ansi myapp: main.o .o .o
$(CC) -o myapp main.o .o .o
main.o: main.c a.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
.o: .c a.h b.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c .c
.o: .c b.h c.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c .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 = - -Wall -ansi myapp: main.o .o .o
$(CC) -o myapp main.o .o .o
main.o: main.c a.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
.o: .c a.h b.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c .c
.o: .c b.h c.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c .c clean:
-rm main.o .o .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) $<

make命令和makefile文件的更多相关文章

  1. 简介make命令和makefile文件

    一.为什么要用到 make 命令和 makefile 文件 在 Linux 下编写一个程序,每次编译都需要在命令行一行一行的敲命令.如果是一个很小的程序还好说,命令不怎的复杂,编译速度也挺快,但是对于 ...

  2. Shell脚本——make命令和Makefile文件【转】

    https://blog.csdn.net/twc829/article/details/72729799 make命令是一个常用的编译命令,尤其在C/C++开发中,make命令通过makefile文 ...

  3. gcc命令以及makefile文件

    (一)makefile里涉及到的gcc命令 gcc -I./inc:指定头文件寻找目录 将按照 ./inc --> /usr/include --> /usr/local/include的 ...

  4. 【C编程基础】make命令和makefile文件

    1.关于程序的编译和链接 一般来说,无论是C.C++首先要把源文件编译成中间目标文件即 Object File(windows为.obj文件,unix为.o文件),这个动作叫做编译(compile). ...

  5. 利用 autoconf 和 automake 生成 Makefile 文件

    一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...

  6. make命令以及makefile

    make命令以及makefile使用RCS与CVS进行源代码控制编写手册页使用patch与tar发布软件开发环境 多源代码的问题 当我们编写小程序时,许多人都是简单的在编辑后通过重新编译所有的文件重新 ...

  7. MakeFile 文件详解

    GNU的make工作时的执行步骤入下:(想来其它的make也是类似)      1.读入所有的Makefile.      2.读入被include的其它Makefile.      3.初始化文件中 ...

  8. 工程管理之makefile与自动创建makefile文件过程

    (风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自动编译和链接使用的环境 想知道到Linux Makefile系统的 ...

  9. 面试题----makefile文件的作用

    make工具和makefile文件 make工具和makefile文件简介 make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具.它不仅常被用于控制源代码的编译和链接,而且还 ...

随机推荐

  1. 对 java 设计模式的一些了解 (正在学习整理中)

    A .设计模式的作用 从书上摘话给你们看看 帮助我们将应用组织成容易了解,容易维护,具有弹性的架构,建立可维护的OO系统,要诀在于随时想到系统以后可能需要的变化以及应付变化的原则. 这么复杂的解释肯定 ...

  2. SetWindowText与SetWindowTextW

    SetWindowTextW用于宽字符SetWindowText  根据定义的宏使用宽字符或者ansi 注意: _T 是自动进行 unicode/ansi版本匹配. 如 _T("aa&quo ...

  3. JS 原生JS 判断滚动条滑动到底部

    window.addEventListener("scroll", function(event) { var scrollTop = document.documentEleme ...

  4. 给JSP应用提供JSTL支持(IntelliJ IDEA)

    ===========手动分割线===2018-12-26============================================= Maven项目直接添加如下依赖即可: <de ...

  5. Windows Server 2008 R2 FTP无法从外部访问的解决方法

    在Windows Server 2008 R2中配置好FTP服务器后,可以在本机访问,但是无法从另一台电脑访问.原因就是在于防火墙没有配置好. 1.首先检查服务器管理器中的入站规则,确保已启用FTP服 ...

  6. PC平台逆向破解

    ---恢复内容开始--- PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ...

  7. orecle触发器

    一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行.因此触发器不需要人为的去调用,也不能调用.然后,触发器的触发条件其实在你定义的时候就已经设定好了.这里面需 ...

  8. LeetCode——Number of Boomerangs

    LeetCode--Number of Boomerangs Question Given n points in the plane that are all pairwise distinct, ...

  9. 配置阿里云maven中央库

    <mirrors> <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> ...

  10. sql server 2014 在windows server 2012 上安装Analysis Services

    Analysis Services Account Name : NT AUTHORITY\SYSTEM