Makefile学习笔记1

1、基本语法与变量

1.1 基本的makefile规则是这样的:

目标(target):目标文件1 目标文件2
<tab>  gcc -o 要建立的执行文件 目标文件1 目标文件2

  

那个目标(target)就是我们想要建立的信息,而目标文件就是所有具有相关性的目标文件。那建立执行文件的语法就是<tab>按键开头的那一行。特别注意:命令行必须要以Tab键作为开头。它的规则基本上是这样的:

  • 在makefile 中的#代表注释;
  • <tab>需要在命令行(例如gcc这个编译器命令)的第一个字符;
  • 目标(target)与依赖文件之间需要用:隔开。

如果想要执行一个命令就可以清除掉所有的目标文件和执行文件,可以这样制作:

#1.先编辑makefile建立新的规则,此规则的名称叫做clean

main:main.o haha.o sin_value.o cos_value.o 
    gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
    rm -f main main.o haha.o sin_value.o cos_value.o

#以新的目标(clean)测试看看执行make的结果:
[root@study ~]# make clean
rm -f main main.o haha.o sin_value.o cos_value.o

  如此一来,如果我们想要建立main的话,输入【make main】;如果想要清除掉所有的文件,输入【make clean】;如果想要先清除所有文件,再建立main的话,输入【make clean main】。

1.2 用变量来简化makefile

LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o

main:${OBJS }
    gcc -o main ${OBJS } ${LIBS}
clean:
    rm -f main  ${OBJS }

  

makefile 语法与bash shell脚本的语法有点区别,变量的基本语法:

  1. 变量与变量内容以【=】隔开,同时两边可以有空格;
  2. 变量左边不可以有<tab>;
  3. 变量与变量内容在【=】两边不能有【:】;
  4. 在习惯上,变量最好以大写字母为主;
  5. 运行变量时,以${变量}或$(变量)使用;
  6. 在该shell的环境变量是可以被套用的,例如提到的CFLAGS这个变量;
  7. 在命令行模式也可以设置变量。

由于gcc在进行编译的时候,会主动读取CFLAGS这个环境变量,所以,你可以直接在shell中定义出这个环境变量,也可以在makefile文件中去定义,更可以在命令行中设定这个环境变量:

[root@study ~]# CFLAGS="-Wall" make clean main
#这个操作在使用make进行编译时,会去读取CFLAGS的变量内容

  也可以是:

[root@study ~]#vim makefile

LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall

main:${OBJS }
    gcc -o main ${OBJS } ${LIBS}
clean:
    rm -f main  ${OBJS }

  环境变量使用的规则是这样的:

  1. make命令行后面加上的环境变量为优先;
  2. makefile里面指定的环境变量第二;
  3. shell原本具有的环境变量第三;

此处还有一些特殊的变量需要了解:

  • $@:代表目前的目标(target):
[root@study ~]#vim makefile

LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall

main:${OBJS }
    gcc -o $@ ${OBJS } ${LIBS}
clean:
    rm -f main  ${OBJS }

  

原文地址:https://www.cnblogs.com/young-dalong/p/15151629.html