Arduino Polska Forum

Pełna wersja: Problem z kompilacją po aktualizacji
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witajcie,

Robiłem projekcik pod BlackPill (STM32). Zainstalowałem odpowiednią płytke itp. Wszystko zadziałało. Kilka dni temu Arduino IDE poinformowało, że jest dostępna aktualizacja softu do płytki, zgodziłem się na update i oczywiście przestało działać. Kompilacja wykłada się z błedem. Widziałem, że w podobnych sytuacjach zwykle proponuje się przeinstalowanie całości - i to zwykle działa, jednak najpierw chciałbym spytać, czy istnieje jakieś krótsze rozwiązanie. Mam następujący log z kompilacji przykładu Blink (poskracałem ścieżki i wywaliłem większość katalogów do -I bo oryginalne linie mają po 3,5KB długości):
Kod:
"bin/arm-none-eabi-g++" -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -DVECT_TAB_OFFSET=0x0 -DUSE_FULL_LL_DRIVER -mthumb "@/tmp/arduino_build_26903/sketch/build.opt" -c  -w -std=gnu++17 -ffunction-sections -fdata-sections -fno-threadsafe-statics --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -fno-use-cxa-atexit  "-I/usr/share/arduino/examples/01.Basics/Blink" "-I.arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/cores/arduino/avr" "-I.arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/cores/arduino/stm32" "-I.arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/cores/arduino/stm32/LL"  ".arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/libraries/SrcWrapper/src/stm32/uart.c" -o "/dev/null"
"bin/arm-none-eabi-g++" -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -DVECT_TAB_OFFSET=0x0 -DUSE_FULL_LL_DRIVER -mthumb "@/tmp/arduino_build_26903/sketch/build.opt" -c  -w -std=gnu++17 -ffunction-sections -fdata-sections -fno-threadsafe-statics --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -fno-use-cxa-atexit  "-I/usr/share/arduino/examples/01.Basics/Blink" "-I.arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/cores/arduino/avr" "-I.arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/cores/arduino/stm32" "-I.arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/cores/arduino/stm32/LL" ".arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/libraries/SrcWrapper/src/syscalls.c" -o "/dev/null"
Generating function prototypes...
"bin/arm-none-eabi-g++" -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -DVECT_TAB_OFFSET=0x0 -DUSE_FULL_LL_DRIVER -mthumb "@/tmp/arduino_build_26903/sketch/build.opt" -c  -w -std=gnu++17 -ffunction-sections -fdata-sections -fno-threadsafe-statics --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -fno-use-cxa-atexit  "-I/usr/share/arduino/examples/01.Basics/Blink" "-I.arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/cores/arduino/avr" "-I.arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/cores/arduino/stm32" "-I.arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/cores/arduino/stm32/LL" "/tmp/arduino_build_26903/sketch/Blink.ino.cpp" -o "/tmp/arduino_build_26903/preproc/ctags_target_for_gcc_minus_e.cpp"
"/usr/bin/arduino-ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "/tmp/arduino_build_26903/preproc/ctags_target_for_gcc_minus_e.cpp"
Kompilowanie szkicu...
"bin/arm-none-eabi-g++" -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -DVECT_TAB_OFFSET=0x0 -DUSE_FULL_LL_DRIVER -mthumb "@/tmp/arduino_build_26903/sketch/build.opt" -c {compiler.optimization_flags} -Wall -Wextra -std=gnu++17 -ffunction-sections -fdata-sections -fno-threadsafe-statics --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -fno-use-cxa-atexit -MMD "-I/usr/share/arduino/examples/01.Basics/Blink" "-I.arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/cores/arduino/avr" "-I.arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/cores/arduino/stm32" "/tmp/arduino_build_26903/sketch/Blink.ino.cpp" -o "/tmp/arduino_build_26903/sketch/Blink.ino.cpp.o"
arm-none-eabi-g++: warning: {compiler.optimization_flags}: linker input file unused because linking not done
arm-none-eabi-g++: error: {compiler.optimization_flags}: linker input file not found: No such file or directory
Użycie biblioteki SrcWrapper w wersji 1.0.1 z folderu: .arduino15/packages/STMicroelectronics/hardware/stm32/2.7.1/libraries/SrcWrapper
exit status 1
Błąd kompilacji dla płytki Generic STM32F4 series.

W ostatniej linii kompilacji pojawia się tekst {compiler.optimization_flags} - podejrzewam że to miało być podmienione na jakieś opcje przez IDE ale coś nie wyszło.

PS. Dziwi mnie też końcówka tych polecen kompilacji  -o /dev/null  ? Przecież to bez sensu - wynik kompilacji do wyrzucenia?
Czy któs próbował używać bibliotek Arduino bez całego systemu Arduino - po prostu makefile?
Trzeba wyłączyć silnik, wysiąść, trzasnąć drzwiami i potem próbować odpalić auto na nowo.
Przeinstalowanie to jednak jest ta krótsza droga, bo skoro powinno się kompilować, to coś z instalacją nie pykło. Czasami nie można zrobić updatu bez modyfikacji swoich programów, niektóre funkcje są wyrzucane z core, albo zaczynają działać inaczej, wtedy downgrade jest szybszą opcją.
Najgorzej jak nowa wersja dodaje uC, którego akurat Ci brakowało, obsługę wymarzonego programatora, a przy okazji coś znika i istniejące programy przestają działać, wtedy warto walczyć.
Bład powodowało przekazanie dziwnego tekstu {compiler.optimization_flags} jako argumentu do kompilacji, więc postanowiłem poszukać napisu optimization_flags w plikach arduino. W ukrytym podkatalogu ".arduino15", w katalogu domowym, poleceniem grep -rn optimization_flags * znalazłem plik packages/STMicroelectronics/hardware/stm32/2.7.1/platform.txt, który kilkukrotnie zawierał poszukiwany ciąg znaków. Plik jest nieduży i tekstowy. W okolicy linii 23 znajdowała się następująca treść:
Kod:
# EXPERIMENTAL feature: optimization flags
#  - this is alpha and may be subject to change without notice
compiler.optimization_flags={compiler.optimization_flags}
compiler.optimization_flags.release={build.flags.optimize} {build.flags.debug}
compiler.optimization_flags.debug=-Og -g
Trochę wygląda to podejrzanie bo taki sam identyfikator jest po obu stronach znaku =. Zamieniłem tą linię na swoją, ustawiając jakąś stała opcje optymalizacji, konkretnie -O2 (skoro nie korzystam z debuggera)

Kod:
# EXPERIMENTAL feature: optimization flags
#  - this is alpha and may be subject to change without notice
#compiler.optimization_flags={compiler.optimization_flags}
compiler.optimization_flags=-O2
compiler.optimization_flags.release={build.flags.optimize} {build.flags.debug}
compiler.optimization_flags.debug=-Og -g
Oczywiście oryginał zachowałem w komentarzu.
Kompiluje przykład Blink i ... działa!

Oczywiście edytowany plik należy do pakietu opisującego procki STM, ma również adnotacje, że to wersja eksperymentalna, więc może jakiś kolejny update poprawi problem. Jak ktoś się jeszcze nie zorientował - używam Linuxa, stąd takie ścieżki i polecenia.
Dzięki za podzielenie się rozwiązaniem.