Makefile介绍和编写

2022-03-16  本文已影响0人  JeremyL

makefile是一个辅助程序编译的文件,在其中可以申明编译所需要的依赖和规则。

# 1. 为什么需要makefile文件

g++ -o out main.cpp example1.cpp ...

但是,在一个大的项目中,开发者常常会遇到:

## 1.1 有时候程序的依赖和链接是复杂的,需要手动处理;

## 1.2 项目会包含很多源文件,编译过程会很费时间;Makefile 支持多线程并发操作,并且可以编译特定文件(例如修改过的文件);

## 1.3 不同的源文件需要不同的编译器。

# 2. Makefile 规则

targets : prerequisites
    command
#targets: 目标文件;
#prerequisites:依赖文件;
#command:需要执行的shell命令;

main.o : main.cpp  
    g++ -c -I $(INCLUDE) main.cpp 

# 3. 变量

## 3.1 Makefile 有四种基本变量赋值方式

## 3.2 变量的引用

OBJ=main.o test.o test1.o test2.o
main:$(OBJ)
      gcc -o main $(OBJ)

## 3.3 预定义变量

main:main.o
    gcc -o $@ $^

# 4. 搜索路径

## 4.1 VPATH 设置环境变量

VPATH := src car
或
VPATH := src:car

VPATH=src car
main:main.o
    gcc -o $@ $^

## 4.2 vpath 设置特定搜索模式和路径。

vpath *.c src car         
或
vpath *.c src : car

vpath *.c src car 
main:main.o
    gcc -o $@ $^

# 5. 条件判断

# 6. 函数调用

$(<function> <arguments>)    或
${<function> <arguments>}
OBJ=$(patsubst %.c,%.o,1.c 2.c 3.c)
test:
    @echo $(OBJ)

# 7. makefile文件模版

# makefile template
INCLUDE = ./include
binPath=$(HOME)/bin
OBJS = main.o test1.o test2.o 

HH = ./include/test1.h ./include/teat2.h 

ifndef CXX
CXX = $(CXX) $(CXXFLAGS)
endif
CXXFLAGS=-pipe \
         -g \
         -std=c++11 

Tool : $(OBJS)
    $(CXX) $(CXXFLAGS) -o Tool $(OBJS) 
main.o : main.cpp  
    $(CXX) $(CXXFLAGS) -c -I $(INCLUDE) main.cpp    
test1.o : test1.cpp $(HH)
    $(CXX) $(CXXFLAGS) -c -I $(INCLUDE) test1.cpp
test2.o : test2.cpp $(HH)
    $(CXX) $(CXXFLAGS) -c -I $(INCLUDE) test2.cpp
.PHONY : clean
clean :
    @rm $(OBJS)
    @mv $@ ${BIN}
    @echo "Finish !"
OBJ=$(wildcard *.c)
test:$(OBJ)
    gcc -o $@ $^
# 命令的变量
CXX:C++编译程序
AR:函数库打包程序
AS:汇编语言编译程序
CC:C编译程序
CXX:C++编译程序
CO:从 RCS 中提取文件的程序。
CPP:C程序的预处理器
FC:Fortran 和 Ratfor 的编译器和预处理程序
GET:从SCCS文件中扩展文件的程序
LEX:Lex方法分析器程序
PC:Pascal 语言编译器
YACC:Yacc 文法分析器(针对于C程序)
YACCR:Yacc 文法分析器(针对于Ratfor程序)

# 命令参数的变量
CFLAGS: C语言编译器参数
CXXFLAGS: C++语言编译器参数

# 参考:

[GNU make

上一篇 下一篇

猜你喜欢

热点阅读