J'essaie de créer un projet makefile en utilisant la bibliothèque mbed pour l'utiliser dans un projet plus important que je souhaite effectuer plus tard. Je le répertoire du projet mis en place comme ça ...La bibliothèque n'inclut pas de détection d'en-tête dans le chemin d'inclusion
.
|-- 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
Plus précisément, mon erreur est dans lib/mbed/platform.h
, qui tente d'inclure device.h
. J'ai un makefile qui devrait l'ajouter au chemin include, mais g ++ semble toujours incapable de le trouver. Voici l'erreur exacte ...
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
Ligne 1 de main.cc est #include "../lib/mbed/mbed.h"
NUCLEO_F446RE.mk
définit le comprennent spécifique à l'appareil chemin que je me sers, et j'espère pouvoir être en mesure de choisir le fichier .mk
à utiliser en fonction d'une variable que je passe au makefile, de sorte que je puisse facilement utiliser une autre carte mbed si je le souhaite. Voici le contenu de 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 \
...
Pour faire bonne mesure, voici mon makefile. J'ai essayé de garder tout aussi propre que possible.
#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/[email protected] $<
obj/%.o: %.cc
$(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/[email protected] $<
obj/%.o: %.cpp
$(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/[email protected] $<
obj/%.o: %.asm
$(CC) $(CPU) -c -x assembler-with-cpp -o asm/[email protected] $<
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
$(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $(DEST)/[email protected] $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)
$(PROJECT).bin: $(PROJECT).elf
$(OBJCOPY) -O binary $< [email protected]
$(PROJECT).hex: $(PROJECT).elf
@$(OBJCOPY) -O ihex $< [email protected]
$(PROJECT).lst: $(PROJECT).elf
@$(OBJDUMP) -Sdh $< > [email protected]
lst: $(PROJECT).lst
size: $(PROJECT).elf
$(SIZE) $(PROJECT).elf
DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
-include $(DEPS)
Une grande partie du code que j'ai ici est basé sur la sortie de l'IDE mbed en ligne après l'exportation d'un projet simple à un makefile. Cependant, l'export avait tout dans un seul répertoire, et ce sera extrêmement compliqué car je commence à faire de plus gros projets et éventuellement à ajouter plus de bibliothèques. Ce qui est étrange, c'est que ce projet se compile sans erreur quand j'utilise la version exportée mono-répertoire. Que se passe-t-il ici? Pourquoi g ++ ne voit-il pasdevice.h
dans ma version multi-répertoire?
EDITS 2016-05-09: Modifications mineures à makefile, même erreur.
J'ai corrigé le problème '% .o' et j'ai essayé de supprimer tous les' ./'' de 'NUCLEO_F446RE.mk'. Il me donne toujours la même erreur. Dois-je créer des règles distinctes pour gérer les fichiers objet mbed? –
@CalebReister Une faute de frappe peut-être? Je devine '-include $ (CIBLE) _mbed.mk' devrait être' include $ (TARGET) .mk', et se débarrasser du '-' il masquait l'erreur. Supprimer le '. /' Ne vous aidera pas avec le second problème, le problème est que vous envoyez les objets à 'obj/$ @' mais votre règle dit que vous les éditez en '% .o' (qui est' $ @ '). – user657267
J'ai corrigé le premier problème et corrigé une erreur de syntaxe dans '$ (TARGET) .mk'. Le deuxième problème s'avère plus compliqué.Je vais mettre à jour mon message avec de nouvelles informations. –