zoukankan      html  css  js  c++  java
  • Makefile 中:= ?= += =的区别

    遇到的makefile:
    CC      = arm-Linux-gcc
    LD      = arm-linux-ld
    AR      = arm-linux-ar
    OBJCOPY = arm-linux-objcopy
    OBJDUMP = arm-linux-objdump


    INCLUDEDIR      := $(shell pwd)/include
    CFLAGS          := -Wall -Os -fno-builtin-printf
    CPPFLAGS        := -nostdinc -I$(INCLUDEDIR)


    export  CC AR LD OBJCOPY OBJDUMP INCLUDEDIR CFLAGS CPPFLAGS


    objs := start.o main.o uart.o clock.o lib/libc.a


    uart.bin: $(objs)
            ${LD} -Tuart.lds -o uart.elf $^
            ${OBJCOPY} -O binary -S uart.elf $@
            ${OBJDUMP} -D uart.elf > uart.dis


    .PHONY : lib/libc.a
    lib/libc.a:
            cd lib; make; cd ..


    %.o:%.c
            ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<


    %.o:%.S
            ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<


    clean:
            make  clean -C lib
            rm -f uart.bin uart.elf uart.dis *.o

    问题:

    1、“=” 与“:=”的区别

    2、export

    答案:

       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、export行是shell命令;对每一行shell命令,make将启动一个新的进程执行这行shell命令。由于新启动的子 进程的环境变量完全跟父进程不相干,因此export并不能改变父进程的环境变量,进而也不能改变父进程以后启动的子进程,或曰“弟弟进程”的环境变量

  • 相关阅读:
    linksys wrt160nv3 刷dd-wrt固件
    win2008 r2 远程桌面问题
    windows server 2008 集成raid卡驱动
    gitlab-ce
    git
    批量发布jar包springboot应用
    gradle
    lvs
    rsyslog
    特殊权限
  • 原文地址:https://www.cnblogs.com/oracleloyal/p/6092526.html
Copyright © 2011-2022 走看看