Makefile快速入门

简介: Makefile快速入门

一、规则

对于范例1.1

执行make

输出"hello all" (默认是第一目标 all)

执行make all 输出"hello all"。 执行make test 输出"hello test"

对于范例1.2

执行make (默认是第一个目标 test)

对于范例1.3

执行make

先执行依赖目标test,再执行all

注意是Tab,而不能是空格

二、gcc编译

foo.c

#include <stdio.h>
void foo () 
{
  printf("This is foo   ()!\n");
}

main.c

extern void foo();
int main ()
{
  foo();
  return 0;
}

直接用gcc就能编译出main了

gcc -o main main.c foo.c

三、make编译程序

gcc编译选项-o和-c介绍

.PHONY: main clean
test: main foo.o
  gcc -o simple main.o foo.o
main: main.c
  gcc -o main.o -c main.c
foo.o: foo.c
  gcc -o foo.o -c foo.c
clean:
  rm simple main.o foo.o

上面依次执行

gcc -o foo.o -c foo.c
gcc -o main.o -c main.c
gcc -o simple main.o foo.o

四、伪对象.PHONY

makefile中.PHONY的作用是什么?

如果不加 .PHONY: main clean

test: main foo.o
  gcc -o simple main.o foo.o
main: main.c
  gcc -o main.o -c main.c
foo.o: foo.c
  gcc -o foo.o -c foo.c
clean:
  rm simple main.o foo.o

如果当前文件目录下存在 上面对象中的任意一个,比如main或者clean,再去执行make,都会发生错误。

比如目录下有个main文件,再去执行,就会出错。

因此可以加入.PHONY: main,使得去忽略当前目录下的main文件。

另外补充了clean,去删除当前目录下生成的内容

五、变量

引⼊了 CC 和 RM 两个变量,⼀个⽤于保存编译器名,⽽另⼀个⽤于指示删除⽂件的命令是什么。还有就是引⼊了 EXE 和 OBJS 两个变量,⼀个⽤于存放可执⾏⽂件名,可另⼀个则⽤于放置所有的⽬标⽂件名。采⽤变量的话,当我们需要更改编译器时,只需更改变量赋值的地⽅,⾮常⽅便

.PHONY: clean
CC = gcc
RM = rm
EXE = simple
OBJS = main.o foo.o
$(EXE): $(OBJS)
  $(CC) -o $(EXE) $(OBJS)
main.o: main.c
  $(CC) -o main.o -c main.c
foo.o: foo.c
  $(CC) -o foo.o -c foo.c
clean:
  $(RM) $(EXE) $(OBJS)

注意:依赖是从左到右的,比如 sample:main.o foo.o

六、自动变量

如果想采⽤ echo 输出‘$’,则必需⽤两个连着的‘$’。还有就是,$@对于 Shell 也有特殊的意思,我

们需要在“$$@”之前再加⼀个脱字符‘\

.PHONY: all
all: first second third
  @echo "\$$@ = $@"
  @echo "$$^ = $^"
  @echo "$$< = $<"
first:
  @echo "1 first"
second:
  @echo "2 second"  
third:
  @echo "3 third"

make的输出结果

七、常用函数


相关文章
|
6月前
|
编译器 Shell Linux
Makefile(3)进阶
Makefile(3)进阶
51 0
|
6月前
|
Shell Linux C++
Makefile编译实战
Makefile编译实战
86 0
|
Java C语言 Android开发
Makefile快速入门
Makefile快速入门
72 0
|
Java 编译器 Linux
Makefile教程(入门介绍)
Makefile教程(入门介绍)
115 0
|
开发者
Makefile基础教程(伪目标)
Makefile基础教程(伪目标)
109 0
|
3月前
|
编译器 Linux C语言
Makefile实战论(一)
Makefile实战论(一)
|
6月前
Makefile(1)入门
Makefile(1)入门
45 0
|
6月前
|
JSON 开发工具 开发者
CMake进阶教程:深入FetchContent与ExternalProject模块
CMake进阶教程:深入FetchContent与ExternalProject模块
493 0
|
6月前
|
中间件
Cmake快速入门
Cmake快速入门
90 0
|
Shell
如何使用makefile
如何使用makefile