一步一步写Makefile(1):概念,变量,自动推导,Makefile相互引用

一步一步写Makefile

概念:

       Make命令执行时是一步一步去解析Makefile文件内容

1. 每一个源文件都对应一个.o中间文件

2. 链接时就是链接这些中间文件里的全局变量和函数,如extern变量,包含了别的源文件里的函数声明并且用了这个函数,链接时就要去找这个函数的实现了

3. 中间文件.o太多,于是就有了.a文件了,他是多个.o文件的打包,这样就不用指明很多个中间链接文件名**.o了,只需要指明一个.a文件就可以。

4.  

cc编译用法:

      [root@ouyanghaibin lesson6]#cc --help

用法:cc [选项] 文件...   

例如[root@ouyanghaibinlesson6]# cc -c -o main.o  main.c

[root@ouyanghaibinlesson6]# cc -c -o main.o main.c

[root@ouyanghaibinlesson6]# cc -c main.c

[root@ouyanghaibinlesson6]# cc main.c -c -o main.o

[root@ouyanghaibinlesson6]# cc main.c -o main  生成可执行文件

 

从这些用法例子可以看出,选项和源文件前后顺序可以随便放,但是要满足一个完整选项必须整个在一起,如-c       -omain.o        main.c        三个选项各个项必须完整

cc不但可以生成中间文件也可以生成可执行文件

常用选项:

 

  -E                       仅作预处理,不进行编译、汇编和链接

  -S                       编译到汇编语言,不进行汇编和链接

  -c                       编译、汇编到目标代码,不进行链接

  -g               加入调试信息

  -o <文件>                输出到 <文件>

main.c
#include<stdio.h>
#include "test1.h"
#include "test1.h"   //多次包含也不会出错
int test2(void);
int main(void)
{
	printf("main.c\n");
	test1();
    test2();
}


test1.c
#include<stdio.h>
int test1(void)
{
	printf("test1.c\n");
}

test1.h
#ifndef _TEST1_
#define _TEST1_

int test1(void);

#endif


test2.c
#include<stdio.h>
int test2(void)
{
	printf("test2.c\n");
}



Makefile1
include Makefile2



Makefile2
variable=main.o test1.o test2.o

main:$(variable)
	cc -o main $(variable)

#进一步加入自动推导之后
$(varible): :test1.h


clean:
	-rm $(variable) main  #正确



##################1:最原始的Makefile###################
main:main.o test1.o test2.o
	cc -o main main.o test1.o test2.o
main.o:main.c test1.h test2.h
	cc  -c main.c test1.h
test1.o:test1.c
	cc  -c test1.c
test2.o:test2.c
	cc  -c test2.c
clean:
	rm main.o test1.o test2.o main



#################2:加入变量后的Makefile#################
variable=main.o test1.o test2.o
#variable:main.o test1.o test2.o  错误!产生不了main可执行文件
#所以严格用法:符号用于Makefile的一条规则里目标和依赖之间
#=符号用于变量定义
#也可以用:=定义变量,可避免变量循环递归定义variable:=main.o test1.o test2.o

#main:variable  #错误!必须要有$符号
main:$(variable)
	cc -o main $(variable)

	
main.o:main.c test1.h
	cc  -c main.c test1.h
test1.o:test1.c
	cc  -c test1.c
test2.o:test2.c
	cc  -c test2.c
clean:
	rm main.o test1.o test2.o main
#rm $(variable) main  正确




#################3:加入自动推导后的Makefile#################
variable=main.o test1.o test2.o

main:$(variable)
	cc -o main $(variable)

	
main.o:test1.h     #正确,可以自动推导出来main.c  当然像test1.h这样的头文件是推导不出来的
#只能推导出和目标同名的源文件
main.o:test1.h
#	cc test1.h  错误!cc里源文件要写就得写完整,要不就一个不写
test1.o:

test2.o:test2.c

clean:
	rm $(variable) main  #正确




#################4:进一步加入自动推导之后的Makefile#################
variable=main.o test1.o test2.o

main:$(variable)
	cc -o main $(variable)

#进一步加入自动推导之后
main.o test1.o test2.o:test1.h
#$(varible):test1.h  也正确

clean:
	rm $(variable) main  #正确




#################5:引用别的Makefile之后的Makefile#################
include Makefile2  #将会把Makefile2中的内容在这里展开,执行Makefile2中的规则,产生 #Makefile2的目标,注意#include后面不要<>尖括号



 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值