C'est parce que String.h et Arduino.h et les include avr sont dans des répertoires définis et connus.
Toutes les installations les ont et donc l'environnement Arduino les met dans les chemins d'include par défaut du compilateur GCC
Par contre les libs, tu en a certaines, j'en ai d'autres et pour chaque projet on n'utilise pas les mêmes.
Donc l'équipe Arduino a pris le partit :
- De ne pas inclure systématiquement toutes les libs installées dans les chemins de recherche d'include
- D'identifier celles que tu utilises en analysant le .INO et uniquement le .INO
- De fabriquer un CPP qui est le fichier INO re-travailler
Ce n'est pas un environnement de développement fait par des informaticiens, c'est à l'origine un projet d'artistes.
Regarde plus en détail les traces qui sont générés pendant la compil via l'IDE Arduino.
La phase de préprocesseur Arduino n'est pas montrée mais après fabrication du CPP :
Compilation de blink.cpp (fabriqué à partir de blink.ino).
D:\Projets\tools\arduino\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=102 -ID:\Projets\tools\arduino\hardware\arduino\cores\arduino -ID:\Projets\tools\arduino\hardware\arduino\variants\standard d:\tmp\build1109244496596348257.tmp\blink.cpp -o d:\tmp\build1109244496596348257.tmp\blink.cpp.o
Constate le peu de répertoire de recherche d'include qui sont passés : core-arduino, variant-standard (pour une UNO).
Compilation du Core Arduino :
D:\Projets\tools\arduino\hardware\tools\avr\bin\avr-gcc -c -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=102 -ID:\Projets\tools\arduino\hardware\arduino\cores\arduino -ID:\Projets\tools\arduino\hardware\arduino\variants\standard D:\Projets\tools\arduino\hardware\arduino\cores\arduino\WInterrupts.c -o d:\tmp\build1109244496596348257.tmp\WInterrupts.c.o
D:\Projets\tools\arduino\hardware\tools\avr\bin\avr-gcc -c -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=102 -ID:\Projets\tools\arduino\hardware\arduino\cores\arduino -ID:\Projets\tools\arduino\hardware\arduino\variants\standard D:\Projets\tools\arduino\hardware\arduino\cores\arduino\wiring.c -o d:\tmp\build1109244496596348257.tmp\wiring.c.o
.... (j'en enlève un pu)
D:\Projets\tools\arduino\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=102 -ID:\Projets\tools\arduino\hardware\arduino\cores\arduino -ID:\Projets\tools\arduino\hardware\arduino\variants\standard D:\Projets\tools\arduino\hardware\arduino\cores\arduino\WString.cpp -o d:\tmp\build1109244496596348257.tmp\WString.cpp.o
Fabrique un vrai lib core.a a partir de ce qu'il vient de compiler :
D:\Projets\tools\arduino\hardware\tools\avr\bin\avr-ar rcs d:\tmp\build1109244496596348257.tmp\core.a d:\tmp\build1109244496596348257.tmp\WInterrupts.c.o
D:\Projets\tools\arduino\hardware\tools\avr\bin\avr-ar rcs d:\tmp\build1109244496596348257.tmp\core.a d:\tmp\build1109244496596348257.tmp\wiring.c.o
.....
D:\Projets\tools\arduino\hardware\tools\avr\bin\avr-ar rcs d:\tmp\build1109244496596348257.tmp\core.a d:\tmp\build1109244496596348257.tmp\WString.cpp.o
Edition de lien et fabrication du fichier HEX
D:\Projets\tools\arduino\hardware\tools\avr\bin\avr-gcc -Os -Wl,--gc-sections -mmcu=atmega328p -o d:\tmp\build1109244496596348257.tmp\blink.cpp.elf d:\tmp\build1109244496596348257.tmp\blink.cpp.o d:\tmp\build1109244496596348257.tmp\core.a -Ld:\tmp\build1109244496596348257.tmp -lm
D:\Projets\tools\arduino\hardware\tools\avr\bin\avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 d:\tmp\build1109244496596348257.tmp\blink.cpp.elf d:\tmp\build1109244496596348257.tmp\blink.cpp.eep
D:\Projets\tools\arduino\hardware\tools\avr\bin\avr-objcopy -O ihex -R .eeprom d:\tmp\build1109244496596348257.tmp\blink.cpp.elf d:\tmp\build1109244496596348257.tmp\blink.cpp.hex
Regarde dans ton cas, identifie le répertoire de travail de l'IDE et va voir par toi même à quoi ressemble le CPP généré.
Il faut donc utiliser l'environnement Arduino pour ce qu'il est prévu : des petits projets simples.
Si tu veux plus de rigueur et un environnement traditionnel de développeur, tu prends AVRstudio.
Il faut ajouter quelques passerelles, recompiler le core-Arduino pour en faire une vrai lib et puis ca marche.