【发布时间】:2013-12-25 03:04:46
【问题描述】:
我有以下设置。在主文件夹和同一个文件夹中有两个名为 /driverlib 和 /inc 的文件夹,我有一个链接器文件和两个 c 文件,startup_gcc 和 blink.c。
我遵循了我在网上找到的 STM32F4 模板。我对其进行了修改并尝试在我的文件夹中包含这两个目录。但是我收到以下错误:
C:\Users\D\Documents\ARM-Tiva\blinky3>make
driverlib/adc.c:49:24: fatal error: inc/hw_adc.h: No such file or directory
compilation terminated.
make: *** [driverlib/adc.o] Error 1
有人可以向我解释如何包含这两个目录,以便 /inc 文件夹对 /driverlib 文件夹可见。
这是生成文件:
OBJCOPY = $(TC)-objcopy
OBJDUMP = $(TC)-objdump
SIZE = $(TC)-size
###################################################
# Set Include Paths
INCLUDES = -I /inc
INCLUDES = -I /driverlib
# Set Sources
LIB_SRCS = $(wildcard driverlib/*.c)
USER_SRCS = $(wildcard src/*.c)
# Set Objects
LIB_OBJS = $(LIB_SRCS:.c=.o)
USER_OBJS = $(USER_SRCS:.c=.o) startup_gcc.o
# Set Libraries
LIBS = -lm -lc
###################################################
# Set Board
MCU = -mthumb -mcpu=cortex-m4
DEFINES = -DPART_LM4F120H5QR -DTARGET_IS_BLIZZARD_RA1
# Set Compilation and Linking Flags
CFLAGS = $(MCU) $(FPU) $(DEFINES) $(INCLUDES) \
-g -Wall -std=gnu90 -O0 -ffunction-sections -fdata-sections
ASFLAGS = $(MCU) $(FPU) -g -Wa,--warn -x assembler-with-cpp
LDFLAGS = $(MCU) $(FPU) -g -gdwarf-2 \
-Ttivalinker.ld \
-Xlinker --gc-sections -Wl,-Map=$(PROJ_NAME).map \
$(LIBS) \
-o $(PROJ_NAME).elf
###################################################
# Default Target
all: $(PROJ_NAME).bin info
# elf Target
$(PROJ_NAME).elf: $(LIB_OBJS) $(USER_OBJS)
@$(CC) $(LIB_OBJS) $(USER_OBJS) $(LDFLAGS)
@echo $@
# bin Target
$(PROJ_NAME).bin: $(PROJ_NAME).elf
@$(OBJCOPY) -O binary $(PROJ_NAME).elf $(PROJ_NAME).bin
@echo $@
#$(PROJ_NAME).hex: $(PROJ_NAME).elf
# @$(OBJCOPY) -O ihex $(PROJ_NAME).elf $(PROJ_NAME).hex
# @echo $@
#$(PROJ_NAME).lst: $(PROJ_NAME).elf
# @$(OBJDUMP) -h -S $(PROJ_NAME).elf > $(PROJ_NAME).lst
# @echo $@
# Display Memory Usage Info
info: $(PROJ_NAME).elf
@$(SIZE) --format=berkeley $(PROJ_NAME).elf
# Rule for .c files
.c.o:
@$(CC) $(CFLAGS) -c -o $@ $<
@echo $@
# Rule for .s files
.s.o:
@$(CC) $(ASFLAGS) -c -o $@ $<
@echo $@
# Clean Target
clean:
$(RM) $(LIB_OBJS)
$(RM) $(USER_OBJS)
$(RM) $(PROJ_NAME).elf
$(RM) $(PROJ_NAME).bin
$(RM) $(PROJ_NAME).map
问题显然出在这一段:
###################################################
# Set Include Paths
INCLUDES = -I /inc
INCLUDES = -I /driverlib
# Set Sources
LIB_SRCS = $(wildcard driverlib/*.c)
USER_SRCS = $(wildcard src/*.c)
# Set Objects
LIB_OBJS = $(LIB_SRCS:.c=.o)
USER_OBJS = $(USER_SRCS:.c=.o) startup_gcc.o
我不明白为什么 driverlib 不包含 inc 目录文件。
编辑
我想澄清我的设置以供将来参考:在名为 blinky 的主文件夹中,我有三个文件夹:driverlib、inc 和 src。 driverlib 和inc 文件夹取自TivaWARE 文件夹,而src 文件夹包含blinky.c 和startup_gcc.c 文件。如果您使用 make ,则给出以下内容:
C:\Users\D\Documents\ARM-Tiva\blinky>make
driverlib/adc.c:49:24: fatal error: inc/hw_adc.h: No such file or directory
compilation terminated.
make: *** [driverlib/adc.o] Error 1
这说明driverlib文件夹中的文件adc.c不能包含文件hw_adc.h
我按照以下建议修改了 Makefile:
# Set Sources
LIB_SRCS = $(wildcard driverlib/*.c)
USER_SRCS = $(wildcard src/*.c)
# Set Objects
LIB_OBJS = $(LIB_SRCS:.c=.o)
USER_OBJS = $(USER_SRCS:.c=.o) src/startup_gcc.o
# Set Include Paths
INCLUDES = -Idriverlib/ \
-Iinc \
-Isrc/
Betas 解决方案很有帮助,唯一的问题是我不想编辑 driverlib 文件夹中的所有文件。目录的命名约定不是我的决定。如果您可以看到 driverlib 文件夹中的所有文件,您会发现每个驱动程序文件(例如 CAN 驱动程序或 ADC)都遵循此约定:
#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_can.h"
#include "inc/hw_ints.h"
#include "inc/hw_nvic.h"
#include "inc/hw_memmap.h"
#include "inc/hw_sysctl.h"
#include "inc/hw_types.h"
#include "driverlib/can.h"
#include "driverlib/debug.h"
#include "driverlib/interrupt.h"
所以现在我知道问题出在哪里,但我缺乏编辑 Makefile 的理解。 通常,如果文件 can.c 和 can.h 位于 driverlib 文件夹中,使用 #include "can.h" 就足够了,所以我不明白如果所有 .h 和 .c 都使用 #include "driverlib/can.h" 有什么意义文件位于同一 driverlib 文件夹中。如果我编辑所有 inc/ 标头,那么我可以获得一个工作二进制文件。然而,目的不是修改从 TI 获得的默认库存驱动程序文件和文件夹,而是使用 Makefile。
因此,为了澄清您是否遵循 Betas 解决方案并编辑所有文件,或者如果您将所有文件放在一个大目录中,那么您可以获得一个工作二进制文件。另外,为了将来参考,我发现我可以使用 Energia 来做我正在做的事情,因为它使用相同的编译器,并且 TIVA 包括刻录在 ROM 上的完整外围库。
【问题讨论】:
-
我已经试过了。我仍然得到同样的错误。我也尝试阅读 Make 手册,但没有取得太大的成功。
-
“inc/hw_adc.h”不在“/inc”或“/driverlib”中。如果您已经在包含路径中添加了“inc/”,也许您可以将“inc/hw_adc.h”替换为“hw_adc.h”。
-
我这样做了,如果我从主文件的标题中删除目录部分,它就会以这种方式工作。我所做的是将所有文件放在一个大目录中,发现它们编译得很好,我可以得到一个 bin 文件。当它们被放回目录时,一切都会停止工作。以下是主文件的标题: #include
#include #include "inc/tm4c123gh6pm.h" #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "driverlib/sysctl.h" #include "driverlib/rom.h" #include "driverlib/rom_map.h" #include "driverlib/gpio.h" #include "driverlib/systick.h" -
在
#include指令中拼出路径通常是个坏主意。你能告诉我们adc.c中的#include指令吗?