makefile中的标的(di)

  • 什么是 标的?
    • 标的就是在makefile中单冒号前的名称,是代表了一个与他同名的文件,编译之后生成的.o文件,编译链接之后生成的可执行文件或者其他任何类型的文件,例如下边例子中main这个标的代表的就是main这个可执行文件。
    main:
    	    gcc -o main main.c
    
  • 标的的语法
    	target ...: prerequisites
            command
            command
    
    target代表的是一个 标的(可以有1+个),prerequisites代表的是这个标的所依赖的标的(1+个),下面那个command就是生成这个标的 的命令。
  • 标的 在makefile中的执行过程
    • 1.makefile中的每个标的都代表了一个文件。
    • 2.如果只运行make命令(区别make all等),那么默认执行第一个标的。
    • 3.执行一个标的时,会做两件事情:
      • 3.1.查看与这个标的同名的文件是否存在,如果不存在,那么就运行这个标的下面的命令。
      • 3.2.如果与这个标的同名的文件已经存在,那么就检查与这个标的同名的文件是否需要更新(即标的文件的修改时间是否早于依赖文件的修改时间),如果需要更新,那么就运行这个标的下面的命令。
  • 重要的例子
    • 例1
      		main:
      				gcc -o main main.c
      
    如果makefile这样写,第一次make命令能编译,后面如果还想再用make命令编译的话,就会出现这样的错误:make “main” is up to date.即使更改了main.c中的代码,也会出现这样的错误。原因就是那个main标的所依赖的标的文件为空,所以那个main文件永远不会过期,所以,每回执行make命令都会提示main is up to date.(意思是这个文件是最新的,不需要更新了)
    • 例2(clean标的):
    main: main.c
    	gcc -o main main.c
    clean:
    	rm main
    
    如果运行make clean命令,那么就会删除main这个可执行文件,那么这个标的的原理是什么呢?其实当运行make clean命令之后,它的执行步骤是这样的:
      由于clean标的没有依赖的文件,所以它就是检查clean这个文件是否存在,如果不存在,那么执行clean标的下面的命令来生成clean文件。但是下面的rm命令又不会生成clean文件,所以导致的结果就是每回我们运行make clean命令,都会执行下面的rm命令。如下图所示:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章