makefile-伪目标与编程实例分析

2018-03-07  本文已影响0人  qiuzy_666

makefile中的目标的含义:

默认情况下,

编程实验1:(make默认认为目标对应着一个文件)

当前目录结构如下:


示例

func.c源文件如下:

void fun()
{
    printf("void fun():hello makefile \n");
}

main.c源文件如下:

extern void fun();

int main()
{
    fun();
 
    return 0;
}

makefile源文件如下:

hello.out:main.o func.o
        gcc -o hello.out main.o func.o

main.o:main.c
        gcc -o main.o -c main.c
        
func.o:func.c
        gcc -o func.o -c func.c
        
clean:
        rm *.o hello.out

命令行执行结果如下:

image
分析: 执行make clean命令会将当前目录下的所有.o文件和hello.out一起删除;而当再次执行make clean的时候由于当前目录下已经没有.o文件和hello.out文件,所以会出现提示信息无法移除文件

编程实验2:(make以文件处理作为第一优先级)

当前目录结构如下:


示例

main.c func.c makefile文件内容均与编程实验1保持一致,命令行执行结果如下:

image

分析: 由于当前目录下存在文件clean,故当执行make clean的命令时,make以文件处理作为第一优先级,而当前文件已经是最新的,故不会再执行make clean命令。
出现此问题的解决方法为增加伪目标,,具体分析请看编程实验3。

编程实验3:(伪目标的引入,保证与目标的依赖无关,目标中的命令总是被执行)

当前目录结构如下:


示例

main.c func.c 文件内容均与编程实验1保持一致,makefile文件做如下修改(在clean目标之前增加代码:.PHONY:clean):

## makefile
hello.out :main.o func.o
    gcc -o hello.out main.o func.o

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

func.o:func.c
    gcc -o func.o -c func.c

.PHONY:clean

clean:
    rm *.o hello.out

命令行执行结果如下:

示例

伪目标知识:

编程实验4(使用伪目标模拟C语言中的函数调用)

当前目录结构如下:


示例

main.c func.c 文件内容均与编程实验1保持一致,makefile文件做如下修改(在clean目标之前增加代码:.PHONY:clean):

## makefile
hello.out :main.o func.o
        gcc -o hello.out main.o func.o

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

func.o:func.c
        gcc -o func.o -c func.c

.PHONY:rebuild clean all

rebuild:clean all

all:hello.out

clean:
    rm *.o hello.out
示例
分析: 由于reuild、clean、all被.PHONY定义为伪目标;故每次执行rebuild、all、clean目标的时候与目标对应的命令都会被执行;所以当执行make rebuild的时候,实际上是先执行clean命令(移除当前目录下所有的.o文件和hello.out文件),然后执行all命令(执行hello.out命令)

编程实验5(绕开.PHONY关键字定义伪目标 )

##makefile
hello.out :main.o func.o
    gcc -o hello.out main.o func.o

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

func.o:func.c
    gcc -o func.o -c func.c

clean:FORCE
    rm *.o hello.out

FORCE:

命令行执行结果如下:


示例

小结:

上一篇 下一篇

猜你喜欢

热点阅读