linux下makefile自我笔记

刚看了下网上各种怎么写makefile资料,记下想法以备后用

现在有三个.h文件,四个.c文件对其编写makefile

三个头文件为input.h output.h calculate.h

四个.c文件input.c output.c calculate.c main.c

最简单的makefile格式是

target:prerequisites

    cmd

因此以上makefile最原始写法应该是

out: main.o input.o outout.o calculate.o//目标out,依赖于main.o input.o outout.o calculate.o四个文件

    cc -o out main.o input.o output.o calculate.o//具体命令,下同

main.o:  main.c input.h  output.h  calculate.h
    cc -c main.c
input.o:input.c input.h
    cc -c input.c
output.o: output.c  output.h
    cc -c output.c

calculate.o:calculate.c calculate.h

 cc -c calculate.c

clean :

    rm  -rf *.o out 

生成的out为可执行文件

接下来进行修改函数的目录,并进行makefile修改

target:prerequisites//目标和需求文件:需要具体地址,否则找不到报错

    cmd:具体命令

out: main.o input.o outout.o calculate.o//目标out,依赖于main.o input.o outout.o calculate.o四个文件

    cc -o out main.o input.o output.o calculate.o//具体命令,下同

main.o:  main.c input/input.h  output/output.h  calculate/calculate.h
    cc -c main.c
input.o:input/input.c input/input.h
    cc -c input.c
output.o: output/output.c  output/output.h
    cc -c output.c

calculate.o:calculate/calculate.c calculate/calculate.h

 cc -c calculate.c

clean :

    rm  -rf *.o out //此时生成的所有.o文件位于makefile同目录下

接下来进行简化,主要通过引入变量进行

obj =main.o input.o output.o calculate.o

deps= input.h output.h calculate.h

out : $(obj)

    cc -o out $(obj)

$(%.o): $(%.c) $(deps)

    cc -c $< -o $@//$<表示第一个依赖项目,也就是%.c $@表示当前语句目标

clean:

    rm -rf *.o out

已经很简单了,但是还可以更加简洁,通过隐含的规则让makefile自动推导

http://www.gnu.org/software/make/manual/make.html#Combine-By-Prerequisite

在这个网站有相关介绍

即只给出依赖的其他头文件,不给.c文件,系统自动根据目标.o推导出应该编译的.c再进行编译

obj =main.o input.o output.o calculate.o

deps= input.h output.h calculate.h

out:$(obj)

    cc -o out $(obj)

$(obj):$(deps)//根据obj的名称来推导出相应的.c自动产生相关语句

clean:

    rm -rf *.o out

你以为到这里就完了么,后面还有

以上makefile在适配某个程序时需要修改不少东西,但是利用shell自动生成一些字段将大大减少出错可能性以及各种麻烦

cc =gcc                                                        //编译器为gcc
src =$(shell find ./ -name "*.c")                    //将当前目录以下所有.c文件拿出来做成字符串
deps=$(shell find ./ -name "*.h")                  //将当前目录以下所有.h文件拿出来做成字符串

obj =$(src:%.c=%.o)                                    //将.c结尾的文件将其后缀.c替换成.o生成.o目标字符串

targetname=hello                                        //app名

$(targetname): $(obj)                                //  依靠所有.o文件生成可执行文件
$(cc) -o $(targetname) $(obj)                    //具体命令

$(obj):$(deps)                                            //隐含生成各个.o文件

clean:                                                        //清理生成的各个文件

rm -rf $(targetname) $(obj)

这个脚本可以适配相当多的程序,只需将其放入需要编译的根目录中,修改targetname就能生成对应可执行文件了,不过应该还存在不少问题,今后再对其进行修改。

 









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值