linux编程学习笔记(五) make的使用和Makefile



1 基本构成语法

基本单位目标target
目标名:依赖目标 依赖目标 #空格分开 '#是注释'
\t@目标指令 #可以加@来隐藏打印命令
\t目标指令

make  -f 脚本文件 目标名


1输入一个整数判定是否是素数
		input.c
		#include <stdio.h>
		int input()
		{
			int r;
			printf("输入一个整数:");
			scanf("%d",&r);
			return r;
		}
	
	primer.c
	int primer(int n)
	{
		int i=2;
		for(;i*i<=n; i++)
		{
			if( n%i == 0)
			{
				return 0;
			}
			
		}
		return 1;
	}
	
		demo.c
		#include <stdio.h>
		main()
		{
			int r =input();
			if(primer(r))
			{
				printf("%d是素数\n",r);
			}
			else
			{
				printf("%d是和数\n",r);
			}	
		}
		

#demo.mk
	
main:demo.c	libpm.so
	gcc -o main demo.c -lpm -L.
libpm.so:input.o primer.o
	gcc -shared -olibpm.so input.o primer.o 
input.o:input.c
	gcc -c -fpic input.c
primer.o:primer.c 
	gcc -c -fpic primer.c
.PHONY:clean
clean:
	rm *.o main *.so *.a.



编译
make -f demo.mk (默认执行第一个目标main)
执行
export LD_LIBRARY_PATH=.
./main


2默认规则

a若不指定目标 默认只执行第一个目标
b不指定make文件 默认执行makefile Makefile
小写makefile优先

3 目标调用规则:

make执行目标:(make把目标当文件)
搜索与目标相同的文件
如果文件存在,则判定日期,若日期是最新的,则停止执行,输出提示
如果文件日期不是最新,则进行执行
文件存在提示:
zhao@ubuntu:~/unix/two/demo-excise$ make -f demo.mk main
make: “main”是最新的。
比较:当前目标与依赖目标进行比较,依赖目标比当前目标新,则要执行


4 建议:(见demo.mk)

每个编译结果做为一个目标,并且把编译结果做为目标名
第一次make ,main不存在,需要执行
第二次make,main是最新的,则不执行
第三次,改变input.c 再 make执行目标
发现
1 demo.c和main一样新
2 再查main的另一个依赖 libpm.so是否更新,此时要查看libpm.so的依赖 input.o primer.o 是否更新
3 发现input.o的依赖input.c比input.o更新,则要执行input.o目标下的语句
4 input.o比libpm.so更新,执行libpm.so下的语句
5 libpm.so比main 更新,执行main下的语句

5 潜规则(不建议使用)

.c目标与.o目标
查找.o目标 目标不存在 就把.o替换成.c

查找.c存在,实施潜规则,直接调用gcc把.c变成.o

#demo.mk

CC=gcc
main:demo.c	libpm.so
	gcc -o main demo.c -lpm -L.
libpm.so:input.o primer.o
	gcc -shared -olibpm.so input.o primer.o 
clean:
	rm *.o main *.so *.a
zhao@ubuntu:~/unix/two/demo-excise$ make -f demo.mk main
gcc    -c -o input.o input.c
gcc    -c -o primer.o primer.c
gcc -shared -olibpm.so input.o primer.o 
gcc -o main demo.c -lpm -L.


6 变量

变量名可以大写可以小写


定义:
变量名=值 值
OBJ=input.o primer.o
使用:
$(变量名)
$(OBJ)
或者
$(环境变量)
( ) 与 { }作用是相同的

OBJ=input.o primer.o
main:demo.c	libpm.so
	gcc -o main demo.c -lpm -L.
libpm.so:input.o primer.o
	gcc -shared -olibpm.so $(OBJ)
input.o:input.c
	gcc -c -fpic input.c
primer.o:primer.c 
	gcc -c -fpic primer.c
clean:
	echo $(LD_LIBRARY_PATH)
	rm *.o main *.so *.a


7 伪目标:不把目标作为文件处理的目标

比如上面那个clean,如果当前目录下有个clean文件,makefile会觉得clean是最新的。
此时声明clean为伪目标


声明伪目标
.PHONY:clean play


OBJ=input.o primer.o
main:demo.c	libpm.so
	gcc -o main demo.c -lpm -L.
libpm.so:input.o primer.o
	gcc -shared -olibpm.so $(OBJ)
input.o:input.c
	gcc -c -fpic input.c
primer.o:primer.c 
	gcc -c -fpic primer.c
.PHONY:clean play
clean:
	echo $(LD_LIBRARY_PATH)
	rm *.o main *.so *.a
play:
	echo "play"








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值