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命令用法

基本用法:make           //直接使用make,相当于make第一个目标
       或make 目标 

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 安装已编译好的程序,其实就是把目标可执行文件拷贝到指定的目录中去
print 列出改变过的源文件
tar 把源程序打包备份. 也就是一个tar文件
dist 创建一个压缩文件, 一般是把tar文件压成Z文件. 或是gz文件
TAGS 更新所有的目标, 以备完整地重编译使用
check 或 test 一般用来测试makefile的流程

猜你喜欢

转载自www.cnblogs.com/zhouyuqing1024/p/11688455.html