美文网首页
makefile入门

makefile入门

作者: 风骚无俩 | 来源:发表于2020-06-07 09:44 被阅读0次

    典型的makefile规则如下,参考howto_makefiles

    • target 通常是程序所生成的文件的名字,类型如可执行文件或目标文件(.o)
    • dependency是用来创建目标文件的依赖文件,target会依赖好几个这样的文件
    • command 是make所要执行的命令,可能有多个,每个命令都必须以tab键开头
    target :dependency1 dependency2 ...
            command
    
    #使用目标文件program.o和mylib.o生成可执行文件program
    program: program.o mylib.o
        gcc -o program program.o mylib.o
    

    单个文件的编译很简单

     myprog : myprog.c 
          gcc -g -Wall -o myprog myprog.c
    

    规则很简单,但上面的只能针对具体的文件,不够通用,我们可以简单泛化,对于单个文件,只要配置TARGET 为源文件名称即可

     # 使用参数配置编译器, gcc for C ,  g++ for C++
      CC = gcc
      # 编译参数设置:
      #  -g    在可执行文件中添加调试信息
      #  -Wall 尽可能多的显示编译警告
      CFLAGS  = -g -Wall
    
      # 最终可执行的目标文件,
      TARGET = myprog
    
      $(TARGET): $(TARGET).c
        $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c
    
    

    但实际中开发很少是单文件编译,下面看如何使用多个源文件编译,其实本质和盖楼一样,每一步依赖之前的产出,比如创建一个可执行文件 count 我们需要三个目标文件countwords.o, counter.o, 和 scanner.o:

    count:  countwords.o counter.o scanner.o 
        $(CC) $(CFLAGS) -o count countwords.o counter.o scanner.o
    

    目标文件countwords.o如果不存在,也是需要从源文件编译生成的 ,假如是 countwords.c, scanner.h, and counter.h:

    countwords.o:  countwords.c scanner.h counter.h 
        $(CC) $(CFLAGS) -c countwords.c
    

    同理,counter.o scanner.o也是这个思路

    counter.o:  counter.c counter.h 
        $(CC) $(CFLAGS) -c counter.c
     
    scanner.o:  scanner.c scanner.h 
        $(CC) $(CFLAGS) -c scanner.c
    
    

    合在一起就是多文件编译生成最终可执行文件count,这种写法和我们手动编译是反者的,它是从结果找条件,手动编译的先创造条件最终生成结果。了解规则以后,写起来就很容易

    count:  countwords.o counter.o scanner.o 
        $(CC) $(CFLAGS) -o count countwords.o counter.o scanner.o
    countwords.o:  countwords.c scanner.h counter.h 
        $(CC) $(CFLAGS) -c countwords.c
    counter.o:  counter.c counter.h 
        $(CC) $(CFLAGS) -c counter.c
    scanner.o:  scanner.c scanner.h 
        $(CC) $(CFLAGS) -c scanner.c
    

    由于makefile只能有一个目标,当TARGET有多个目标文件时,可以构造一个没有规则的终极目标all,并以冒号后面的文件作为依赖

    all:main1 main2
    main1: main1.c
       gcc main1.c -o main1
    main2: main2.c
       gcc main2.c -o main2
    

    相关文章

      网友评论

          本文标题:makefile入门

          本文链接:https://www.haomeiwen.com/subject/pnhkphtx.html