zoukankan      html  css  js  c++  java
  • makefile 学习的点滴总结-(2)

    目录

    1、=和:=的区别

    2、Makefile  $@, $^, $< 

    3、“order-only”依赖   “|”的用法

    4、wildcard使用

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    1、=和:=的区别。

      (1)“=”

          make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:

                x = foo
                y = $(x) bar
                x = xyz

          在上例中,y的值将会是 xyz bar ,而不是 foo bar 。

          (2)“:=”

          “:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。

                x := foo
                y := $(x) bar
                x := xyz

          在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    2、Makefile  $@, $^, $< 
    $@  表示目标文件
    $^  表示所有的依赖文件
    $<  表示第一个依赖文件
    $?  表示比目标还要新的依赖文件列表

    如一个目录下有如下文件:

    $ ls
    hello.c  hi.c  main.c  Makefile

    按照 Makefile 规则规规矩矩的写:

    main: main.o hello.o hi.o
            gcc -o main main.o hello.o hi.o

    main.o: main.c
            cc -c main.c

    hello.o: hello.c
            cc -c hello.c

    hi.o: hi.c
            cc -c hi.c

    clean:
            rm *.o
            rm main

    改为用上述符号进行替代:

    main: main.o hello.o hi.o
            gcc -o $@ $^
    main.o: main.c
            cc -c $<
    hello.o: hello.c
            cc -c $<
    hi.o: hi.c
            cc -c $<
    clean:
            rm *.o
            rm main

    beyes@debian:~/makefile_test/semicolon/real$ make
    cc -c main.c
    cc -c hello.c
    cc -c hi.c
    gcc -o main main.o hello.o hi.o
    beyes@debian:~/makefile_test/semicolon/real$ ls
    hello.c  hello.o  hi.c  hi.o  main  main.c  main.o  Makefile

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    3、“order-only”依赖的使用举例:
          LIBS = libtest.a
        foo : foo.c | $(LIBS)
            $(CC) $(CFLAGS) $< -o $@ $(LIBS)
    make在执行这个规则时,如果目标文件“foo ”已经存在。当“foo.c”被修改以后,目标“foo ”
    将会被重建,但是当“libtest.a ”被修改以后。将不执行规则的命令来重建目标“foo ”。 
    就是说,规则中依赖文件$(LIBS)只有在目标文件不存在的情况下,才会参与规则的执行。当目
    标文件存在时此依赖不会参与规则的执行过程。

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    4、wildcard使用

    在 Makefile 有这样一个变量定义:“objects = *.o ”。它表示变量“objects”的值是字符串“*.o”(并不是期
    望的空格分开的.o 文件列表)。

    当需要变量“objects”代表所有.o 文件列表示,需要使
    用函数“wildcard”

    objects = $(wildcar *.o)

    例1:

    objects = *.o 
     foo : $(objects)
    cc -o foo $(CFLAGS) $(objects)

    如果工作目录下有".o"文件,则"foo"会按照规则进行重建。

    但是,如果工作目录下没有".o"文件,在执行make的时候就会报错,这时就需要将变量用wildcard来定义:

    objects = $(wildcar *.o)

    ###############################################################

    例2:

    “$(patsubst %.c,%.o,$(wildcard *.c))”

    表示使用“wildcard”函数获取工作目录下的.c 文件列表;之后将列表中所有文件名的后缀.c 替换为.o

    #sample Makefile
    objects := $(patsubst %.c,%.o,$(wildcard *.c)) 
    foo : $(objects)
      cc -o foo $(objects)

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

     

     

  • 相关阅读:
    Subclipse安装及应用【eclipse 3.7 + subclipse1.8】
    淘宝有病!
    集装箱货柜号码 公式算法
    自己网站利用支付宝结算时的说明
    发现安全卫士360影响电脑正常运行
    中国银行的动态口令
    c#中的接口(interface)到底应用在哪些地方?
    淘宝有病(二)
    What 's CATT(Computer Aided Test Tool)?How to deal with the CATT in the SAP System?什么是CATT(计算机附加测试工具)
    Consultanting Service
  • 原文地址:https://www.cnblogs.com/hxu7373/p/3442759.html
Copyright © 2011-2022 走看看