我在下面有一个Makefile,它将$(CC)变量视为cc。变量$(BB)如预期的那样被视为gcc。为什么将$(CC)视为cc而不是gcc
#
# Makefile
BB ?= gcc
CC ?= gcc
LVGL_DIR ?= ${shell pwd}
CFLAGS ?= -Wall -Wshadow -Wundef -Wmaybe-uninitialized -O3 -g0 -I$(LVGL_DIR)/
# LDFLAGS ?= -lSDL2 -lm
LDFLAGS ?= -lm
BUILDDIR := build
BINDIR := bin
BIN = $(BINDIR)/output
#Collect the files to compile
MAINSRC = ./main.c
include $(LVGL_DIR)/lvgl/lvgl.mk
include $(LVGL_DIR)/lv_drivers/lv_drivers.mk
#include
INC := -I . -I lvgl -I lv_drivers
#CSRCS +=$(LVGL_DIR)/mouse_cursor_icon.c
OBJEXT ?= .o
AOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))
# AOBJS = $(patsubst %,%,$(ASRCS:.S=$(OBJEXT)))
#reference
# SOURCES := $(shell find . -type f -iname "*.$(SRCEXT)" )
# OBJECTS := $(patsubst %,%,$(SOURCES:.$(SRCEXT)=.o))
MAINOBJ = $(MAINSRC:.c=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS) $(MAINSRC)
OBJS = $(AOBJS) $(COBJS)
## MAINOBJ -> OBJFILES
all: default
%.o: %.c
@echo "TEST $(CC) $(BB) $<"
$(CC) $(CFLAGS) $(INC) -c $< -o $@
default: $(AOBJS) $(COBJS) $(MAINOBJ)
@mkdir -p $(BINDIR)
$(CC) -o $(BIN) $(MAINOBJ) $(AOBJS) $(COBJS) $(LDFLAGS)
clean:
rm -f $(BIN) $(AOBJS) $(COBJS) $(MAINOBJ)更新
如果我注释#CC ?= gcc,那么它仍然被视为cc。如果我运行命令echo $CC,则不会打印任何内容。那么是谁将CC设置为cc的呢?
发布于 2020-12-19 16:25:09
BB ?= gcc
CC ?= gcc
all:
echo $(CC)
echo $(BB)会工作得很好
> make
echo cc
cc # default value is being picked up
echo gcc
gcc但是,如果您在环境中已经有了CC,或者您将CC作为参数传递,那么它将选择现有值
> make CC=aa
echo aa
aa
echo gcc
gcc或者像这样
> export CC=dd
> make
echo dd
dd
echo gcc
gcc此外,请注意,GNU Make在其src/default.c内部定义了许多默认值- CC就是其中之一。
#ifdef GCC_IS_NATIVE
"CC", "gcc",
#else
"CC", "cc",
#endifhttps://stackoverflow.com/questions/65362956
复制相似问题