库包含未检测到包含路径中的标头

迦勒·雷斯特(Caleb Reister)

我正在尝试使用mbed库设置一个makefile项目,以便在以后要使用的更大项目中使用。我已经像这样设置了项目目录...

.
|-- Doxyfile
|-- NUCLEO_F446RE.mk
|-- Nucleo_blink.map
|-- asm
|-- attach.gdb
|-- debug
|-- gdb-pipe.cfg
|-- lib
|   `-- mbed
|       |-- AnalogIn.h
|       |-- ...
|       |-- TARGET_NUCLEO_F446RE
|       |   |-- TARGET_STM
|       |   |   `-- TARGET_STM32F4
|       |   |       |-- PeripheralPins.h
|       |   |       |-- TARGET_NUCLEO_F446RE
|       |   |       |   |-- PeripheralNames.h
|       |   |       |   |-- PinNames.h
|       |   |       |   |-- PortNames.h
|       |   |       |   |-- device.h
|       |   |       |   `-- objects.h
|       |   |       `-- gpio_object.h
|       |   |-- TOOLCHAIN_GCC_ARM
|       |   |   |-- STM32F446XE.ld
|       |   |   |-- board.o
|       |   |   |-- ...
|       |   |   `-- system_stm32f4xx.o
|       |   |-- arm_common_tables.h
|       |   |-- ...
|       |   `-- system_stm32f4xx.h
|       |-- Ticker.h
|       |-- ...
|       `-- wait_api.h
|-- makefile
|-- obj
|-- release
`-- src
    `-- main.cc

具体来说,我的错误是在lib/mbed/platform.h,它尝试包含device.h我有一个应该将其添加到包含路径的makefile,但是g ++似乎仍然找不到它。这是确切的错误...

arm-none-eabi-g++    -c -o main.o source/main.cc
In file included from source/../lib/mbed/mbed.h:21:0,
                from source/main.cc:1:
source/../lib/mbed/platform.h:21:20: fatal error: device.h: No such file or directory
#include "device.h"
                    ^
compilation terminated.
<builtin>: recipe for target 'main.o' failed
make: *** [main.o] Error 1

main.cc的第1行是 #include "../lib/mbed/mbed.h"

NUCLEO_F446RE.mk定义了我正在使用的特定于设备的包含路径,我希望能够.mk基于传递给makefile的变量来选择要使用的文件,以便我可以轻松地使用其他mbed板。这是NUCLEO_F446RE.mk...的内容

HARDFP = 1

LIBRARY_PATHS = -L./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM 

CPU = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=$(FLOAT_ABI)

LINKER_SCRIPT = ./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/STM32F446XE.ld

CC_SYMBOLS = -DTARGET_M4 -DMBED_BUILD_TIMESTAMP=1453683815.81 -DTOOLCHAIN_GCC_ARM -DTOOLCHAIN_GCC -DTARGET_RTOS_M4_M7 -DTARGET_FF_MORPHO -DTARGET_CORTEX_M -D__FPU_PRESENT=1 -DTARGET_FF_ARDUINO -DTARGET_STM32F446RE -DTARGET_NUCLEO_F446RE -D__MBED__=1 -DTARGET_STM -DTARGET_STM32F4 -D__CORTEX_M4 -DARM_MATH_CM4

INCLUDE_PATHS = -I./lib/ -I./lib/mbed/ \
-I./lib/mbed/TARGET_NUCLEO_F446RE/ \
-I./lib/mbed/TARGET_NUCLEO_F44\6RE/TARGET_STM/ \
-I./lib/mbed/TARGET_NUCLEO_F446RE/TARGET_STM/TARGET_STM32F4/ \
-I./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/ \
-I./lib/mbed/TARGET_NUCLEO_F446RE/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F446RE/ #<--device.h is here

SYS_OBJECTS = ./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_flash_ramfunc.o \
./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/board.o \
...

好吧,这是我的makefile。我一直在努力使一切保持整洁。

#Project parameters
PROJECT = Nucleo_blink
OBJECTS = main.o
DEST    = debug
VPATH   = src lib $DEST
TARGET  = NUCLEO_F446RE

#Compilation options
DEBUG = 1

#Tools
AS      = $(GCC_BIN)arm-none-eabi-as
CC      = $(GCC_BIN)arm-none-eabi-gcc
CXX     = $(GCC_BIN)arm-none-eabi-g++
LD      = $(GCC_BIN)arm-none-eabi-gcc
OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy
OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump
SIZE    = $(GCC_BIN)arm-none-eabi-size 

include $(TARGET).mk

CFLAGS = $(INCLUDE_PATHS) $(CC_SYMBOLS) $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -Wextra -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -MMD -MP

ifeq ($(HARDFP),1)
        FLOAT_ABI = hard
else
        FLOAT_ABI = softfp
endif

ifeq ($(DEBUG), 1)
        CFLAGS += -DDEBUG -O0
else
        CFLAGS += -DNDEBUG -Os
endif

LD_FLAGS = $(CPU) -Wl,--gc-sections --specs=nano.specs -u _printf_float -u _scanf_float -Wl,--wrap,main -Wl,-Map=$(PROJECT).map,--cref
LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys

LIBRARIES = -lmbed 

.PHONY: all clean lst size

all: $(PROJECT).bin $(PROJECT).hex

clean:
        rm -f debug/* obj/* asm/* $(DEPS)

obj/%.o: %.c #<---Attempt to fix target error mentioned by @user657267
        $(CC)  $(CC_FLAGS) $(CC_SYMBOLS) -std=c99 $(INCLUDE_PATHS) -o obj/$@ $<

obj/%.o: %.cc
        $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/$@ $<

obj/%.o: %.cpp
        $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/$@ $<

obj/%.o: %.asm
        $(CC) $(CPU) -c -x assembler-with-cpp -o asm/$@ $<

$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
        $(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $(DEST)/$@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)

$(PROJECT).bin: $(PROJECT).elf
        $(OBJCOPY) -O binary $< $@

$(PROJECT).hex: $(PROJECT).elf
        @$(OBJCOPY) -O ihex $< $@

$(PROJECT).lst: $(PROJECT).elf
        @$(OBJDUMP) -Sdh $< > $@

lst: $(PROJECT).lst

size: $(PROJECT).elf
        $(SIZE) $(PROJECT).elf

DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
-include $(DEPS)

将简单的项目导出到makefile之后,我在这里拥有的许多代码都是基于联机mbed IDE的输出。但是,导出将所有内容都放在一个目录中,当我开始做更大的项目并可能添加更多的库时,这将非常混乱。奇怪的是,当我使用单目录导出的版本时,该项目的编译没有任何错误。这里发生了什么?为什么 在多目录版本中看不到g ++ device.h

编辑2016-05-09:对Makefile进行细微调整,出现同样的错误。

用户名
%.o: %.cc %.cpp

此模式规则(可能)不正确,您告诉make仅当.cc和.cpp文件都存在(或可由其他规则创建)时,才应用此规则。由于main.cpp大概不存在,make会退回到其内置的隐式规则,该规则显然不会知道INCLUDE_PATHS或您用于标志的任何其他非常规变量。

您可以通过将两个规则分开来解决此问题

%.o: %.cc
    $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/$@ $<
%.o: %.cpp
    $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/$@ $<

但是,这些规则仍然被打破,因为当其中之一与./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_flash_ramfunc.o您要放入的内容匹配时obj/./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_flash_ramfunc.o,这意味着make总是会重新编译该对象,因为它不会在您所说的位置(请查看Makefile的非正式规则,特别是2)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

库包含未检测到包含路径中的标头

来自分类Dev

拦截器标头未包含在响应中

来自分类Dev

在C ++中包含标头

来自分类Dev

pygame rect。包含碰撞未检测到

来自分类Dev

cmake仅包含标头库

来自分类Dev

cmake仅包含标头库

来自分类Dev

如何与CMake一起使用包含什么的工具来检测未使用的标头?

来自分类Dev

标头包含效果

来自分类Dev

C ++标头包含

来自分类Dev

Makefile在C中包含多个标头

来自分类Dev

在sQL查询的结果中包含标头

来自分类Dev

仅在接口中包含标头,在实现中不包含

来自分类Dev

如何在VS Code中为IntelliSense配置编写“包含路径(包含标头的文件夹)”

来自分类Dev

Chutzpah未检测到包含枚举的TypeScript测试

来自分类Dev

消息标头未包含在Spring Integration DSL的错误处理中

来自分类Dev

Gmail api响应标头-获取尖括号中包含的信息(php库)

来自分类Dev

创建一个包含仅标头库的Makefile

来自分类Dev

创建一个包含仅标头库的Makefile

来自分类Dev

C ++标准库标头可以包含C标准标头吗?

来自分类Dev

为什么某些LLVM标准库标头包含其他标头,但GCC没有

来自分类Dev

C ++标准库标头可以包含C标准标头吗?

来自分类Dev

嵌套类包含标头

来自分类Dev

如何在CMakeLists中包含库头

来自分类Dev

应用程序中的自定义库,我是否必须两次包含库依赖项标头?

来自分类Dev

AngularJS如何在Http请求中包含标头

来自分类Dev

在Django Rest Framework中包含位置标头

来自分类Dev

HTTP标头可以在字段值中包含冒号吗?

来自分类Dev

使S3在响应中始终包含Vary标头

来自分类Dev

将标头包含到sQL查询的结果中

Related 相关文章

热门标签

归档