Linux c++ 的Makefile文件编写规则

Makefile 指明哪些文件需要先编译,哪些需要后编译,哪些重新编译等等。可以实现“自动化编译”,写好后用make命令(vs: nmake, linux: gnu:make)便可以根据Makefile里的规则实现工程自动编译,能够提高软件开发效率。

makefile规则:

        目标...:依赖...

                命令 (通过执行命令队医来操作生成目标文件)...

.               

规则可以有很多条,但其他规则一般都为第一条服务

app:test.cpp main.cpp
        g++ test.cpp main.cpp -o app

以上makefile内容:执行命令 操作test.cpp main.cpp 依赖 生成app目标文件。

执行规则:

        1)按顺序执行,如果某条依赖不存在,向下寻找是否有生成该依赖的命令,如果有,执行该规则中的命令。 若下面的规则与第一条没有关系,不执行该无关规则。

        2)执行make命令时,会进行检测更新,如果目标文件时间比依赖早,(即依赖被更新)会重新生成目标文件。否则目标不更新,对应规则命令不会重新执行。

app:main.o sub.o add.o
    g++ main.o sub.o add.o -o app

sub.o:sub.cpp
    gcc -c sub.cpp 

add.o:add.cpp
    gcc -c add.cpp

main.o:main.cpp
    gcc -c main.cpp

        效率更高,修改每个文件时只会执行生成对应.o的命令 和最后链接生成可执行程序的命令。

变量

自定义变量:

        var=hello   (变量名=变量值)

预定义变量:

        AR(ar) 归档维护程序的名称           CC(cc)   c编译器名称        CXX(g++) C++编译器名称          以下三个只能用在规则命令中

        $@:目标完整名称           $<  第一个依赖文件的名称         $^  所有依赖文件

获取变量值: $(变量名)  $(var)

模式匹配

        %.o:%.c    %通配符,匹配一个字符,此时两个%匹配的是同一个字符  

app:main.o sub.o add.o
    g++ main.o sub.o add.o -o app

可以写作
app:main.o sub.o add.o
    $(CXX) $^ -o $@


模式匹配后可以写作

src=test.o main.o
target=app

$(target):$(src)
        $(CXX) $^ -o $@

%.o:%.cpp
        $(CC) -c $<

函数

       $(wildcard PATTERN)  获取指定目录下指定类型的文件列表 返回值为若干个文件的文件列表

$(wildcard *.cpp *.o)
返回值是: a.cpp b.cpp a.o b.o

        %(patsubst <pattern>,<replacement>,<text>) 查找text中符合pattern的,替换为replacement

$(patsubst %.c, %o, x.c bar.c d.cpp)
返回 x.o bar.o


src=$(wildcard *.cpp)
target=app
objs=$(patsubst %.cpp, %.o, $(src))
$(target):$(objs)
	$(CXX) $^ -o $@

%.o:%.cpp
	$(CC) -c $<

        clean 规则    没有依赖   .PHONY表明clean是一个伪目标,不会生成对应目标文件

.PHONY:clean
clean:
    rm $(objs) -f

删除所有objs文件。

make 加目标文件  可单独执行该条规则如 make clean 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值