【问题标题】:Include additional directories to Makefile在 Makefile 中包含其他目录
【发布时间】:2021-01-16 05:04:26
【问题描述】:

我是一名学生,目前正在使用英飞凌 XMC4700 uC,最近开始为某些硬件组件编写小型“库”。出于这个原因,我为每个项目创建了一个目录,并将相应的文件放入其中,以便在单独的 main.c 文件中测试每个组件。只要 .h 和 .c 文件与实际的 main.c 文件位于同一目录中,我就知道我必须在 Makefile 中更改什么。

但是,为了清晰和易于理解,我想将所有头文件放在“src”目录中,将所有 .c 文件放在“inc”目录中。 比如当前目录是这样的

~/EigeneProgramme/XMC4700/ShiftRegister
                               |_build
                               |_inc
                               |  |_ project.h
                               |_src
                               |  |_ project.c
                               |_main.c
                               |_Makefile

但是,如果我这样做,程序将不再编译。我的第一种方法是扩展 VPATH 变量以向编译器显示所需文件的路径。

下面的代码显示了当前使用的 Makefile 中某些变量的声明。

CROSS_COMPILE=arm-none-eabi

CC = $(CROSS_COMPILE)-gcc
LD = $(CROSS_COMPILE)-gcc --specs=nosys.specs
AR = $(CROSS_COMPILE)-ar
AS = $(CROSS_COMPILE)-as
OC = $(CROSS_COMPILE)-objcopy
OD = $(CROSS_COMPILE)-objdump
SZ = $(CROSS_COMPILE)-size
ifeq ($(GDB_QUIET),true)
  DB = $(CROSS_COMPILE)-gdb -quiet
else
  DB = $(CROSS_COMPILE)-gdb
endif

BUILDDIR = build
LIB_BUILDDIR = lib_build
USB_LIBDIR = $(XMC_LIBDIR)/ThirdPartyLibraries/USBlib/USB

XMC_SERIES=4700
XMC_PACKAGE=F100
XMC_SIZE=2048

VPATH += $(XMC_LIBDIR)/CMSIS/DSP_Lib/Source/BasicMathFunctions:$(XMC_LIBDIR)/CMSIS/DSP_Lib/Source/CommonTables:$(XMC_LIBDIR)/CMSIS/DSP_Lib/Source/ComplexMathFunctions:$(XMC_LIBDIR)/CMSIS/DSP_Lib/Source/ControllerFunctions:$(XMC_LIBDIR)/CMSIS/DSP_Lib/Source/FastMathFunctions:$(XMC_LIBDIR)/CMSIS/DSP_Lib/Source/FilteringFunctions:$(XMC_LIBDIR)/CMSIS/DSP_Lib/Source/MatrixFunctions:$(XMC_LIBDIR)/CMSIS/DSP_Lib/Source/StatisticsFunctions:$(XMC_LIBDIR)/CMSIS/DSP_Lib/Source/SupportFunctions:$(XMC_LIBDIR)/CMSIS/DSP_Lib/Source/TransformFunctions:$(XMC_LIBDIR)/CMSIS/Infineon/XMC$(XMC_SERIES)_series/Source:$(XMC_LIBDIR)/CMSIS/RTOS/RTX/SRC:$(XMC_LIBDIR)/CMSIS/RTOS/RTX/SRC/ARM:$(XMC_LIBDIR)/CMSIS/RTOS/RTX/Templates:$(XMC_LIBDIR)/CMSIS/RTOS/RTX/UserCodeTemplates:$(XMC_LIBDIR)/ThirdPartyLibraries/Newlib:$(XMC_LIBDIR)/XMCLib/src:$(USB_LIBDIR)/Class/Common:$(USB_LIBDIR)/Class/Device:$(USB_LIBDIR)/Common:$(USB_LIBDIR)/Core:$(USB_LIBDIR)/Core/XMC4000

CFLAGS  = -I$(XMC_LIBDIR)/CMSIS/Include/
CFLAGS += -I$(XMC_LIBDIR)/CMSIS/Infineon/XMC$(XMC_SERIES)_series/Include/
CFLAGS += -I$(XMC_LIBDIR)/XMCLib/inc/
CFLAGS += -I$(USB_LIBDIR)
CFLAGS += -I$(USB_LIBDIR)/Class
CFLAGS += -I$(USB_LIBDIR)/Class/Common
CFLAGS += -I$(USB_LIBDIR)/Class/Device
CFLAGS += -I$(USB_LIBDIR)/Common
CFLAGS += -I$(USB_LIBDIR)/Core
CFLAGS += -I$(USB_LIBDIR)/Core/XMC4000
CFLAGS += -DXMC$(XMC_SERIES)_$(XMC_PACKAGE)x$(XMC_SIZE)
CFLAGS += -mcpu=cortex-m4 -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -mthumb
CFLAGS += -g3 -gdwarf-2
CFLAGS += -c
CFLAGS += -Wa,-adhlns="$@.lst"
SFLAGS = $(CFLAGS)
CFLAGS +=$(SCFLAGS)
SFLAGS += -Wall
CFLAGS += -Wall
CFLAGS += -ffunction-sections
SFLAGS += -x assembler-with-cpp
LFLAGS  = -T$(BUILDDIR)/$(LD_NAME).ld -nostartfiles
LFLAGS += -L$(XMC_LIBDIR)/CMSIS/Lib/GCC/
LFLAGS += -Wl,-Map,"$@.map"
LFLAGS += -mcpu=cortex-m4 -mthumb
LFLAGS += -g3 -gdwarf-2

LIBSRCS += startup_XMC$(XMC_SERIES).c system_XMC$(XMC_SERIES).c
LIBSRCS += syscalls.c


OBJS = $(patsubst %.c,$(BUILDDIR)/%.o,$(SRCS))
LIBOBJS = $(patsubst %.c,$(LIB_BUILDDIR)/%.o,$(LIBSRCS))

不幸的是,我对 Makefile 不是很有经验。出于这个原因,我正在努力调整 Makefile 来编译程序。

那么有人可以提供一个解决方案,如何调整上面显示的我当前 Makefile 的片段来编译程序?

最好的问候

拉德巴尔德迈耶

【问题讨论】:

  • 在提出问题时,请始终包括(通过剪切、粘贴和格式化,而不是解释或截屏)您输入的确切命令和您收到的输出错误消息。如果编译出现问题,请同时包含导致问题的编译器调用(例如,由 make 打印出来)。

标签: c++ c makefile


【解决方案1】:

您应该在CFLAGS 中添加-I_inc

CFLAGS += -I_inc

VPATH 用于另一种用途,主要用于在与源文件不同的目录中生成目标文件。在这种情况下,在_build。当 GNU Make 尝试构建二进制文件时,比如说_build\project.o,它将在 VPATH 目录列表中搜索所有project.c。然后它将编译找到的第一个project.c,并生成对应的project.o

【讨论】:

  • 感谢您的提示。如果我按照建议添加 CFLAG,我就可以编译大部分所需的文件。但是,在最后一步中,编译器无法编译 main.o。因此,编译器似乎不知道在哪里可以找到头文件中预定义函数的定义。
  • build/main.o: 在函数main': /home/EigeneProgramme/XMC4700/ShiftRegister/main.c:16: undefined reference to initialize_ShiftRegister_GPIO' /home/EigeneProgramme/XMC4700/ShiftRegister/main.c:17: 未定义引用initialize_ShiftRegister_CCU43' /home/EigeneProgramme/XMC4700/ShiftRegister/main.c:18: undefined reference to initialize_ShiftRegister_ISR' /home/EigeneProgramme/XMC4700 /ShiftRegister/main.c:19:未定义对“initialize_ShiftRegister”的引用
  • 这与编译无关。编译阶段似乎没问题,问题出在链接器阶段:当链接器需要将所有目标文件.o 收集在一起以生成可执行文件时。您得到的错误意味着链接器无法找到这些函数在哪里实现initialize_ShiftRegister_GPIOinitialize_ShiftRegister。这些函数可能位于 C 文件中,在这种情况下,您应该将 C 文件添加到 SRCS 变量中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多