Küsimus:
Kas .ino Arduino Sketch kompileeritakse otse GCC-AVR-is?
RedDogAlpha
2016-03-07 06:59:57 UTC
view on stackexchange narkive permalink

Olgu, me kõik oleme neid küsimusi kogu veebis näinud, näiteks Arduino v.s. C ++ või muud sarnased küsimused. Ja valdav enamus vastustest ei puuduta kompileerimise erinevusi muud kui ainult abstraktse teabe kaudu.

Minu küsimuse eesmärk on lahendada tegelikud erinevused (mitte eelistused) selles, kuidas .ino-fail ümber nimetatakse .cpp-failiks või muu sarnane faililaiend c ++ jaoks kompileeriks GCC-AVR-i abil. Ma tean, et peate vähemalt lisama Arduino päisefaili, kuid peale selle võib kompileerimisviga tekkida, kui kompenseerida nimetatud .ino-fail .cpp-faili, kasutades näiteks GCC-AVR-i. Lihtsuse huvides laseme klassikalise vilkumisnäite abil selgitada erinevusi. Või kui teil on kasutada paremat koodilõiku, lisage palun igal juhul koodilõik oma vastusesse ja selgitage erinevusi põhjalikult.

Palun ärge arvake, milline on parem viis või tööriist, mida kasutada.

FYI. Ma kasutan arendamiseks Platformio-d ja märkan kompileerimise ajal kulisside taga toimuvat konversiooniprotsessi. Mõistan, mis seal tegelikult toimub, nii et kui Arduinos kodeerin, saan aru ka "puhtast" C ++ versioonist.

Täname läbimõeldud vastuste eest minu küsimusele ette.

Kas küsite konkreetselt töölaua `gcc` või AVC kompilaatori GCC kohta` avr-gcc`? seal on palju suurem erinevus kui faili `.ino` ja` .cpp` vahel.
@BrettAM GCC-AVR tööriistakomplekt, kuna Arduino UNO on sihtplaat ja kasutab Atmeli AVR kiipi, nagu ma olen kindel, et teate. Täname kahtluse eest minu küsimuses helistamise eest. Ja jah, ma tean, et seal on palju suurem erinevus. Sellepärast esitan selle küsimuse. Et teada saada, mis need erinevused on!
Kaks vastused:
Nick Gammon
2016-03-07 08:24:37 UTC
view on stackexchange narkive permalink

Vaadake minu vastust siit: Klassid ja objektid: kui palju ja milliseid failitüüpe mul nende kasutamiseks tegelikult vaja on? - täpsemalt: Kuidas IDE asju korraldab.

Ma tean, et peate vähemalt lisama Arduino päisefaili

Jah, peate seda tegema.

kuid peale selle tekitab kompileerimisvea, kui kompenseeritakse nimetatud .ino-fail .cpp-faili, kasutades näiteks GCC-AVR-i. .Ino faili kood võib seda vajada või mitte (see on tõenäoliselt vajalik, kui autor pole piisavalt distsiplineeritud, et tavalisel C ++ viisil kodeerida ja ise teha).


Kui "visand" sisaldab muid faile (nt muud .ino, .c või .cpp failid), siis tuleks need lisada kompileerimisprotsessi, nagu kirjeldan oma ülalnimetatud vastuses.

Samuti peate ( kompileeri ja) lingi kõigis eskiisi kasutatavates raamatukogudes.


Te pole küsinud asjade linkimise kohta, kuid loomulikult tuleb erinevad kompileeritud failid omavahel linkida ja seejärel muutus üleslaadimise eesmärgil .elf- ja .hex-failiks. Vaadake allpool.


Makefile'i näide

IDE väljundi põhjal tegin lihtsa makefaili mõnda aega tagasi:

  ## Simple Arduino Makefile ## Autor: Nick Gammon # Kuupäev: 18. märts 2015 # kuhu installisite Arduino rakenduseARDUINO_DIR = C: / Documents and Settings / Nick / Desktop / arduino-1.0.6 / # erinevad programmidCC = " $ (ARDUINO_DIR) riistvara / tööriistad / avr / bin / avr-gcc "CPP =" $ (ARDUINO_DIR) riistvara / tööriistad / avr / bin / avr-g ++ "AR =" $ (ARDUINO_DIR) riistvara / tööriistad / avr / bin / avr-ar "OBJ_COPY =" $ (ARDUINO_DIR) riistvara / tööriistad / avr / bin / avr-objcopy "MAIN_SKETCH = Blink.cpp # kompileerimismärgid g ++ ja gcc # jaoks võivad vajada nende muutmistF_CPU = 16000000MCU = atmega328p = kompileeri lipudGEN c -g -Os -Wall -funktsiooniosad -fdata-jaotised -mmcu = $ (MCU) -DF_CPU = $ (F_CPU) L -MMD -DUSB_VID = null -DUSB_PID = null -DARDUINO = 106
CPP_FLAGS = $ (GENERAL_FLAGS) -fno-erandidCC_FLAGS = $ (GENERAL_FLAGS) # kaasatud failide asukohtINCLUDE_FILES = "-I $ (ARDUINO_DIR) riistvara / arduino / südamikud / arduino" "-I $ (ARDUIN) "# teegi allikadLIBRARY_DIR =" $ (ARDUINO_DIR) riistvara / arduino / südamikud / arduino / "järk: $ (CPP) $ (CPP_FLAGS) $ (INCLUDE_FILES) $ (MAIN_SKETCH) -o $ (MAIN_SKETCH) .o $ (CC) $ (CC_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) avr-libc / malloc.c -o malloc.co $ (CC) $ (CC_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) avr-libc / realloc.c -o realloc. co $ (CC) $ (CC_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) WInterrupts.c -o WInterrupts.co $ (CC) $ (CC_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) juhtmestik.c -o juhtmestik.co $ (CC) $ (CC_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) juhtmestiku_analog.c -o juhtmestiku_analog.co $ (CC) $ (CC_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) juhtmestiku_digital.c -o juhtmestik ) $ (CC_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) wiring_pulse.c -o wiring_pulse.co $ (CC) $ (CC_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) wiring_shift.c -o wiring_shift.co $ (CPP) $ (CPP_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) CDC.cpp -o CDC.cpp.o $ (CPP) $ (CPP_F) $ (INCLUDE_FILES) $ (LIBRARY_DIR) HardwareSerial.cpp -o HardwareSerial.cpp.o $ (CPP) $ (CPP_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) HID.cpp -o HID.cpp.o $ (CPP) CPP_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) IP-aadress.cpp -o IP-aadress.cpp.o $ (CPP) $ (CPP_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) main.cpp -o main.cpp.o $ $ (CPP_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) new.cpp -o new.cpp.o $ (CPP) $ (CPP_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) Print.cpp -o Print.cpp.o $ ( CPP) $ (CPP_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) Stream.cpp -o Stream.cpp.o $ (CPP) $ (CPP_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) Tone.cpp -o Tone.cpp.o. $ (CPP) $ (CPP_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) USBCore.cpp -o USBCore.cpp.o $ (CPP) $ (CPP_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) WMath.cpp-W .o
$ (CPP) $ (CPP_FLAGS) $ (INCLUDE_FILES) $ (LIBRARY_DIR) WString.cpp -o WString.cpp.o rm core.a $ (AR) rcs core.a $ (AR) rcs core.a malloc.co $ (AR) rcs core.a realloc .co $ (AR) rcs core.a WInterrupts.co $ (AR) rcs core.a juhtmestik.co $ (AR) rcs core.a juhtmestiku_analog.co $ (AR) rcs core.a juhtmestiku_digital.co $ (AR) rcs core.a wiring_pulse.co $ (AR) rcs core.a wiring_shift.co $ (AR) rcs core.a CDC.cpp.o $ (AR) rcs core.a RiistvaraSerial.cpp.o $ (AR) rcs core .a HID.cpp.o $ (AR) rcs core.a IPAddress.cpp.o $ (AR) rcs core.a main.cpp.o $ (AR) rcs core.a new.cpp.o $ (AR) rcs core.a Print.cpp.o $ (AR) rcs core.a Stream.cpp.o $ (AR) rcs core.a Tone.cpp.o $ (AR) rcs core.a USBCore.cpp.o $ ( AR) rcs core.a WMath.cpp.o $ (AR) rcs core.a WString.cpp.o $ (CC) -Os -Wl, - gc-section -mmcu = $ (MCU) -o $ (MAIN_SKETCH ) .elf $ (MAIN_SKETCH) .o core.a -lm $ (OBJ_COPY) -O ihex -j .eeprom --set-section-flags = .eeprom = jaotamine, laadimine - no-change-warnings --change- jagu-lma. eeprom = 0 $ (MAIN_SKETCH) .elf $ (MAIN_SKETCH). hoia $ (OBJ_COPY) -O ihex -R .eeprom $ (MAIN_SKETCH) .elf $ (MAIN_SKETCH) .hex 

sisse konkreetsel juhul kompileeriti .ino fail probleemideta pärast selle Blink.cpp ümbernimetamist ja selle rea lisamist:

  #include <Arduino.h>  
Tänan Nicki kokkuvõtliku vastuse eest. Ma pole kaugeltki teie tasemel ja ei mõelnud isegi make-faili peale. Nii et põhimõtteliselt on süntaks sama, see on lihtsalt objektide linkimine, eks? Täname, et jagasite oma make-faili minu jaoks lahkamiseks Olen kindel, et sellest tuleneb veel küsimusi! Aitäh veel kord!
Minu ülaltoodud fail toimis selle postitamisel, kuid usun, et see võib vajada hilisemate IDE-de jaoks kohandamist (kuna need liiguvad või nimetavad teegi faile ümber). Siiski näitab üksikasjalik kompileerimine, mida IDE praegu genereerib, mis peaks teid alustama.
Edgar Bonet
2016-03-07 15:37:37 UTC
view on stackexchange narkive permalink

Lisan vaid mõned punktid Nick Gammoni vastusele:

  • Selle kompileerimiseks ei pea .ino-faili ümber nimetama: kui ütlete kompilaatorile selgesõnaliselt, et see on C ++ (valik -x c ++ ), see salvestab ebatavalise faililaiendi ja kompileerib selle kui C ++.
  • Te ei pea lisama #include <Arduino.h> failis .ino: võite kompilaatoril käskida seda teie eest teha ( -include Arduino.h ).

Neid nippe kasutades saan kompileerida Blinki .ino ilma muudatusteta , käivitades avr-g ++ õigete käsureavalikutega:

  avr-g ++ - mmcu = atmega328p -DARDUINO = 105 -DF_CPU = 16000000L \ -I / usr / share / arduino / riistvara / arduino / südamikud / arduino \ -I / usr / share / arduino / riistvara / arduino / variandid / standard \ -Os -fno -erandid -funktsioon-jaotised -fdata-jaotised \ -Wl, - gc-jaotised -g -Wall -Wextra \ -x c ++ - hõlmavad Arduino.h \ / usr / share / arduino / exampl es / 01.Basics / Blink / Blink.ino \ -x none /usr/local/lib/arduino/uno/libcore.a -lm \ -o Blink.elf  

Mõned märkused ülaltoodud käsureale:

  • /usr/local/lib/arduino/uno/libcore.a on koht, kuhu salvestasin kompileeritud Arduino tuuma. Ma vihkan sama kraami uuesti ja uuesti kompileerimist.
  • -x none on vajalik selleks, et kompilaatorile meeldiks faililaiendid uuesti meelde tuletada. Ilma selleta eeldaks, et libcore.a on C ++ -fail.

Ma õppisin neid trikke Sudar Muthu arduino-makefile'ist. See on väga üldine Makefile, mis töötab paljude tahvlite ja raamatukogudega. Ainus asi, mis Arduino IDE-ga võrreldes puudu on, on edasideklaratsioonid.

Väga tore, Edgar! Minu lahendus jäljendab põhimõtteliselt seda, mida IDE teeb, teie lahendus on tegelik probleem lahendamiseks palju korralikumal viisil. Muidugi peaksite eelnevalt tegema faili `libcore.a`. Ma arvan, et minu vastuses olevad read, mis ehitavad `core.a`, saaksid ette ära teha, nii et need ei pea olema iga ehitise osa. Kogemused on näidanud, et keerukamate visandite (nt traadi või SPI kasutamine) jaoks tuleb `core.a 'juurde lisada rohkem faile.
@NickGammon: See on õige, Muthu Makefile (ja ma eeldan, et Arduino IDE) kipub libcore.a-sse panema kõik teie kasutatavad teegid. Mulle see lähenemine tegelikult ei meeldi, kuna see muudab väidetava „tuumikukogu“ sõltuvaks konkreetsest teie koostatavast programmist. Ühe failiga teekide puhul, näiteks Wire või SPI, eelistan lihtsalt panna raamatukogu C ++ faili peamise programmiga samasse kompileerimiskässu. See käsurida läheb kergesti üsna pikaks, nii et ma kasutan Makefile'i.
Üks asi, mis mulle IDE-s meeldib, on see, et te ei pea muhelema. Lihtsate projektide puhul see niikuinii "lihtsalt töötab".


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...