zoukankan      html  css  js  c++  java
  • Makefile 隐含规则,模式规则,常见变量

       隐含规则
    复杂的Makefile一般会使用隐含规则内的变量来简化编译处理。
    将隐含规则中使用的变量分成两种:一种是命令相关的,如“CC”;一种是参数相关的,如“CFLAGS”。这些变量都是大写表示。

      常用的命令变量有:
    CC
    C语言编译程序。默认命令是“cc”
    CXX
    C++语言编译程序。默认命令是“g++”
    CPP
    C程序的预处理器(输出是标准输出设备)。默认命令是“$(CC) –E”
    RM
    删除文件命令。默认命令是“rm –f”

      参数相关的变量:
    CFLAGS
    C语言编译器参数
    CXXFLAGS
    C++语言编译器参数
    LDFLAGS
    链接器参数。(如:“ld”)


      模式规则:
    可以使用模式规则来定义一个隐含规则。一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有"%"字符。"%"的意思是表示一个或多个任意字符。在依赖目标中同样可以使用"%",只是依赖目标中的"%"的取值,取决于其目标。
    如:
    %.o : %.c ; <command ......>; 指出了怎么从所有的[.c]文件生成相应的[.o]文件的规则。如果要生成的目标是"a.o b.o",那么"%c"就是"a.c b.c"。

      常见变量:
    all
    这个伪目标是所有目标的目标,其功能一般是编译所有的目标
    clean
    这个伪目标功能是删除所有被make创建的文件
    install
    这个伪目标功能是安装已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去
    print
    这个伪目标的功能是例出改变过的源文件

    INCLUDE
    指明头文件的路径
    LIBS
    常用于链接时配合LDFLAGS链接动态库,LIBS指明动态库名称,LDFLAGS指出动态库路径
    SOURCE
    指代项目中的源文件
    OBJS
    指代项目中的目标文件
    TARGET
    指代项目中的可执行文件

    附上一个用到上述变量的例子,但不一定能用,自行修改!

     1 #################
     2 ## date:20180305
     3 ##################
     4 
     5 # test SOURCE OBJECT TARGET
     6 SOURCE := main.c test.c
     7 OBJS := main.o test.o
     8 TARGET := main
     9 
    10 
    11 # test CC LDFLAGS LIBS INCLUDE
    12 CC := gcc
    13 LDFLAGS := -L/path/libtest.so
    14 LIBS := -ltest
    15 INCLUDE := -I/path/test.h
    16 
    17 
    18 # test all
    19 all:
    20     $(CC) -O $(TARGET) $(SOURCE)
    21     
    22 
    23 #test clean
    24 clean:
    25     rm -fr *.o
  • 相关阅读:
    函数式编程
    scala 有 + 运算符吗?
    使用 Idea 打 scala程序的 jar 包
    相见恨晚的 scala
    半夜思考,为什么 String 具有不变性
    我的常用
    DataTable学习笔记
    Js 操作cookie
    嵌套的 ajax 请求
    Jquery插件收集【m了慢慢学】
  • 原文地址:https://www.cnblogs.com/chenzhefan/p/8511760.html
Copyright © 2011-2022 走看看