【问题标题】:Make Makefile to build newly created file制作 Makefile 以构建新创建的文件
【发布时间】:2021-04-26 19:05:47
【问题描述】:

我在下面有 Makefile,它应该构建所有新的 *.c 文件,我将放置在当前文件夹中。但这不会发生。我创建了名为mouse_cursor_icon.c 的新文件,并与main_btn.c 一起放在同一个文件夹中。我期待 make 命令将构建并生成 mouse_cursor_icon.o 文件。但这并没有发生。如何解决?

#
# Makefile
#
CC ?= gcc
LVGL_DIR_NAME ?= lvgl
LVGL_DIR ?= ${shell pwd}
CFLAGS ?= -O3 -g0 -I$(LVGL_DIR)/ -Wall -Wshadow -Wundef -Wmaybe-uninitialized -Wmissing-prototypes -Wno-discarded-qualifiers -Wall -Wextra -Wno-unused-function -Wundef -Wno-error=strict-prototypes -Wpointer-arith -fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wno-switch-enum -Wreturn-type -Wmultichar -Wformat-security -Wno-ignored-qualifiers -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body -Wtype-limits -Wshift-negative-value -Wstack-usage=1024 -Wno-unused-value -Wno-unused-parameter -Wno-missing-field-initializers -Wuninitialized -Wmaybe-uninitialized -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wpointer-arith -Wno-cast-qual -Wmissing-prototypes -Wunreachable-code -Wno-switch-default -Wswitch-enum -Wreturn-type -Wmultichar -Wno-discarded-qualifiers -Wformat-security -Wno-ignored-qualifiers -Wno-sign-compare
LDFLAGS ?= -lm
BIN = demo


#Collect the files to compile
MAINSRC = ./main_btn.c

include $(LVGL_DIR)/lvgl/lvgl.mk
include $(LVGL_DIR)/lv_drivers/lv_drivers.mk
include $(LVGL_DIR)/lv_examples/lv_examples.mk

OBJEXT ?= .o

AOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))

MAINOBJ = $(MAINSRC:.c=$(OBJEXT))

SRCS = $(ASRCS) $(CSRCS) $(MAINSRC)
OBJS = $(AOBJS) $(COBJS)

## MAINOBJ -> OBJFILES

all: default

%.o: %.c
    @$(CC)  $(CFLAGS) -c $< -o $@
    @echo "CC $<"
    
default: $(AOBJS) $(COBJS) $(MAINOBJ)
    $(CC) -o $(BIN) $(MAINOBJ) $(AOBJS) $(COBJS) $(LDFLAGS)

clean: 
    rm -f $(BIN) $(AOBJS) $(COBJS) $(MAINOBJ)

【问题讨论】:

  • 整个 makefile 取决于 ASRCSCSRCS 的值,但您没有在此处定义它们。
  • 请阅读 Make 的文档和一些教程。一个makefile“只是”定义了文件之间的依赖关系,以及如何产生它们。 -- 您的 makefile 没有显示任何包含所有 C 源代码的规则。

标签: c makefile


【解决方案1】:

普通 make 没有任何(好的)方式来表示“在一个目录中构建所有 .c 文件”。 GNU make 具有允许这种事情的扩展:它定义了一个wildcard 函数,可用于获取与某种模式匹配的所有(源)文件。例如,您可以在 Makefile 中添加:

CSRCS := $(wildcard ./*.c)

$(CSRCS)(您在别处使用但从不定义)设置为当前目录中的所有 .c 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 2021-05-25
    • 2014-08-17
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多