在make经典教程这篇文章中,对make讲的很详细,但是不太适合小白。

     一个程序语言,从一个个.h和.c文件变成包含0和1的可执行文件需要这么几个环节:

     源程序->预处理->编译和优化->生成目标文件->链接->可执行文件。

      在linux上面我们可以用gcc编译器:

      gcc -c生成目标文件,

     在用gcc -o将目标文件链接成可执行文件

      对于很少的文件我们可以一步步用gcc执行,但是一个大型复杂项目包含多个的文件,我们一步一步用gcc就太麻烦了,如果修改某

一个源文件,你再次执行make命令,它只是编译与该文件相关的目标文件,因此编译节约很多时间。

Makefile需要按照一定的规则编写,所需要执行的命令都是以Tab键开头,用make就会自动执行。

     在VS中我们几乎没见过makefile,因为一般情况下,只需要把需要的文件包含在project中,VS  会自动帮你把makefile写好。

   例子来说明

  test.h用于声明函数

     

/*filename:test.h*/
extern int add(int i,int j);


      test.c用于两个整数的相加

/*filename:add.c*/
int add(int i,int j)
{
    return i+j;
}


      test_main.c中调用add函数

/*filename:test_main.c*/
#include "test.h"
#include  <stdio.h>
main()
{
  int a,b;
  a = 2;
  b = 3;
  printf("the sum of is %d\n",add(a,b));
}


(备注一下:extern可置于变量或者函数前,以表示变量或者函数定义在别的文件中,提示编译器遇到此变量或函数时,在其他模块中寻找定义。

在程序中取代#include “*.h”。)

Makefile的内容:

all:test

test:test_main.o test.o
        gcc test_main.o test.o -o test
test_main.o:test_main.c test.h
        gcc -c test_main.c -o test_main.o
test.o:test.c test.h
        gcc -c test.c -o test.o
clean:
        rm -rf *.o test



注意:Makefile里面的命令是由Tab键开头

使用make,就能看见make命令第一次创建的依赖以及实际的目标

llinux怎么使用make redis和sftp_目标文件


如果你再次查看,目录内容,里面多了一些.o文件和执行文件:

llinux怎么使用make redis和sftp_目标文件_02

执行test便可查看结果:

llinux怎么使用make redis和sftp_#makefile_03

如果对test.c文件进行修改,再使用make编译工程:

llinux怎么使用make redis和sftp_#makefile_04

就只有test.o进行了编译而main_test.o没有重新编译


可以使用clean清理所有目标文件和可执行文件:

llinux怎么使用make redis和sftp_目标文件_05

所有的.o文件和执行文件都被清理了

通过 -B 选项让所有目标总是重新建立


如果上次make执行后没有修改文件,make命令将不会编译。如果你想重新编译可以使用 -B 选项


llinux怎么使用make redis和sftp_#gcc_06


使用 -d选项打印调试信息


想查看make真正执行过程可以使用-d选项


llinux怎么使用make redis和sftp_#make 编译_07


使用 -C 选项改变目录


可以在不同的目录路径中使用make命令,比如你要使用make命令运行../ 目录下的Makefile文件,可以使用-C选项


llinux怎么使用make redis和sftp_目标文件_08


make命令会先切换到指定目录下,在切换回来


通过 -f选项将其它文件作为Makefile


make -f make_test



通过这种方式,make命令会选择扫描make_test来代替Makefile。