Ok, todos nós já vimos essas perguntas em toda a Web, como Arduino vs C ++, ou outras perguntas semelhantes. E uma grande maioria das respostas nem sequer toca em diferenças de compilação, a não ser através de informações abstratas.
Minha pergunta tem como objetivo resolver as diferenças reais (não as preferências) em como um arquivo .ino renomeado para arquivo .cpp ou outra extensão de arquivo semelhante para c ++ seria compilado usando o GCC-AVR. Sei que, no mínimo, você precisa incluir o arquivo de cabeçalho do Arduino, mas além disso, o que causaria um erro de compilação se compilasse o arquivo .ino para .cpp usando, por exemplo, o GCC-AVR. Por uma questão de simplicidade, vamos usar o exemplo clássico de piscada para explicar quais são as diferenças. Ou, se você tem um snippet de código melhor para usar, inclua o snippet em sua resposta e explique as diferenças completamente.
Não tenha opiniões sobre qual é a melhor maneira ou ferramenta para usar.
PARA SUA INFORMAÇÃO. Uso Platformio para desenvolvimento e noto um processo de conversão acontecendo nos bastidores durante a compilação. Estou tentando entender o que realmente está acontecendo lá, então, quando codifico no Arduino, também entendo a versão C ++ "pura".
Agradecemos suas respostas atenciosas à minha pergunta com antecedência.
fonte
gcc
sua área de trabalho ou o compilador GCC for AVRavr-gcc
? existe uma diferença muito maior do que entre.ino
um.cpp
arquivo e um .Respostas:
Veja minha resposta aqui: Classes e objetos: quantos e quais tipos de arquivo eu realmente preciso para usá-los? - especificamente: como o IDE organiza as coisas .
Sim, você precisaria fazer isso.
O IDE gera protótipos de função para você. O código em um arquivo .ino pode ou não precisar disso (provavelmente será necessário, a menos que o autor seja disciplinado o suficiente para codificar da maneira C ++ usual e executá-los eles mesmos).
Se o "esboço" contiver outros arquivos (por exemplo, outros arquivos .ino, .c ou .cpp), eles precisarão ser incorporados no processo de compilação, conforme descrito na minha resposta mencionada acima.
Além disso, você precisaria (compilar e) vincular todas as bibliotecas usadas pelo esboço.
Você não perguntou sobre o lado da vinculação, mas naturalmente os vários arquivos, conforme compilados, precisam ser vinculados e depois transformados em um arquivo .elf e .hex para fins de upload. Ver abaixo.
Makefile de exemplo
Baseado na saída do IDE, criei um makefile simples há algum tempo :
Nesse caso específico, o arquivo .ino foi compilado sem problemas após renomeá-lo para Blink.cpp e adicionar esta linha:
fonte
Gostaria apenas de acrescentar alguns pontos à resposta de Nick Gammon:
-x c++
), ele ignorará a extensão incomum do arquivo e o compilará como C ++.#include <Arduino.h>
o arquivo .ino: pode instruir o compilador a fazer isso por você (-include Arduino.h
).Usando esses truques, posso compilar o Blink.ino sem nenhuma modificação , apenas invocando o avr-g ++ com as opções de linha de comando apropriadas:
Algumas notas na linha de comando acima:
/usr/local/lib/arduino/uno/libcore.a
foi onde salvei o núcleo compilado do Arduino. Eu odeio recompilar repetidamente as mesmas coisas.-x none
é necessário dizer ao compilador para cuidar das extensões de arquivo novamente. Sem ele, seria assumido que libcore.a é um arquivo C ++.Eu aprendi esses truques com o Arduino-Makefile de Sudar Muthu . Este é um Makefile muito geral que funciona com muitas placas e com bibliotecas. A única coisa que falta em relação ao IDE do Arduino são as declarações de encaminhamento.
fonte
libcore.a
arquivo com antecedência. Suponho que as linhas da minha resposta, que compilam,core.a
possam ser feitas com antecedência, para que não precisem fazer parte de cada compilação. A experiência mostrou que esboços mais complexos (por exemplo, usando Wire ou SPI) precisam de mais arquivos para serem adicionadoscore.a
.