make和makefile基础使用
2019-10-16 爱虫子
1. Make和Makefile 简介
make是一款工程管理器,同时也可以视为是一个命令,而Makefile就是该命令的操作对象。当使用make命令时,默认操作当前路径下的Makefile文件,并基于Makefile文件中的内容进行对工程文件的编译、管理等工作。
1.1make和Makefile的意义:
1)减少编译的工作量,节约编译时间
2)简化编译操作
2.Make和Makefile 的简单应用示例
2.1Makefile 语法格式
target ... : prerequisites ...
command
...
target: dependency_files //目标项:依赖项 目标名随便定义
TAB键 command //必须以tab键开头,command编译命令
注意:在写command命令行的时候,必须要在前面按TAB键
解释:
目标项:一般填写需要生成文件,比如工程最终可执行文件、库文件、目标文件等。也可以填写其他任意的名称(伪目标)
依赖项:一般填写生成目标项所依赖的文件
command:一般填写如何通过依赖项生成目标项(可以是多条语句)
当使用make 目标 命令时,则会根据make原则,可能会执行相应的command的内容
2.2Make命令用法
2.3 Makefile编译c程序示例
qing@qing:~/daima/make$ make
gcc -c main.c -o main.o
gcc -c hello.c -o hello.o
gcc main.o hello.o -o main
qing@qing:~/daima/make$cat Makefile
main: main.o hello.o
gcc main.o hello.o -o main
main.o: main.c hello.h
gcc -c main.c -o main.o
hello.o: hello.c
gcc -c hello.c -o hello.o
3.Makefile的变量
Makefile中变量分类:用户自定义变量,预定义变量,自动变量,环境变量
3.1用户自定义变量
变量名:=变量值 简单变量展开(类似于C语言赋值) ,是覆盖之前的值, 通常采用这种形式
A := abc
A := $(A)d
3.2预定义变量
预定义变量:内部事先定义好的变量,但是它的值是固定的,并且有些的值是为空的。
AR:库文件打包程序默认为ar
AS:汇编程序,默认为as
CC:c编译器默认为cc
CPP:c预编译器,默认为$(CC) -E
CXX:c++编译器,默认为g++
RM:删除,默认为rm -f
ARFLAGS:库选项,无默认
ASFLAGS:汇编选项,无默认
CFLAGS:c编译器选项,无默认
CPPFLAGS:c预编译器选项,无默认
CXXFLAGS:c++编译器选项
3.3自动变量
自动变量:指在使用的时候,自动用特定的值替换。
变量 |
说明 |
$@ |
当前规则的目标文件 |
$< |
当前规则的第一个依赖文件 |
$^ |
当前规则的所有依赖文件,以逗号分隔 |
$? |
规则中日期新于目标文件的所有相关文件列表,逗号分隔 |
$(@D) |
目标文件的目录名部分 |
$(@F) |
目标文件的文件名部分 |
4. shell函数优化Makefile
示例:改进后的Makefile
工程中所有文件放在同一路径下。
qing@qing:~/daima/make$cat Makefile EXE := main SRCS := $(wildcard *.c) OBJS := $(SRCS:%.c=%.o) CFLAGS := -Wall -O2 -fpic @# -Wall(输出警告)-O2 (优化的选项) -fpic(节约内存)
$(EXE): $(OBJS)
$(CC) $^ -o $@
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean rebuild
clean:
@$(RM) $(OBJS)
rebuild:
@make clean
@make $(EXE)
总结:
确定Makefile的大致框架,熟悉Makefile常用函数、规则的用法。
之后编写多文件工程时,将整个工程文件封装到成一个文件夹,将Makefile加入,使用Makefile进行编译工程
5. Makefile 中的函数
常用几个shell函数有 wildcard,patsubst,addprefix
6. Makefile中一些GNU约定俗成的伪目标
伪目标 |
含义 |
all | 所有目标的目标,其功能一般是编译所有的目标 |
clean | 删除所有被make创建的文件 |
install | 安装已编译好的程序,其实就是把目标可执行文件拷贝到指定的目录中去 |
列出改变过的源文件 | |
tar | 把源程序打包备份. 也就是一个tar文件 |
dist | 创建一个压缩文件, 一般是把tar文件压成Z文件. 或是gz文件 |
TAGS | 更新所有的目标, 以备完整地重编译使用 |
check 或 test | 一般用来测试makefile的流程 |