Ocorre-me que, além do meu problema atual, devo perguntar: "O que devo saber ao criar uma biblioteca para o Arduino?"
Primeiro, o que estou fazendo:
Estou usando o Eclipse como meu editor e escrevendo código em C ++. Eu escrevi um aplicativo Arduino simples que inclui meu arquivo de cabeçalho e estou trabalhando com erros.
Primeiro problema: como eu faço uma 'limpeza limpa'? Estou vendo erros que acho que corrigi, quase como se o arquivo de cabeçalho estivesse em cache. (Sim, provavelmente estou fazendo algo estúpido [ editar : eu estava], mas ainda gostaria de saber como limpar a biblioteca e não sei onde estão os arquivos dos objetos).
Segundo: quais convenções devo estar ciente? Não usei o Arduino tanto quanto gostaria e é muito bom programar em C ++, mas sei que a intenção das bibliotecas é manter as coisas agradáveis e simples para os usuários. Existem convenções para nomes de funções? Criando constantes (parece que o espaço para nome global está poluído com #defines)? E assim por diante.
Por fim, há mais alguma coisa que eu deva saber?
Devo mencionar que observei o Tutorial da biblioteca do Arduino , que é bom, mas não vai muito longe. Eu também espiei algumas das bibliotecas que estão instaladas no meu sistema.
Respostas:
Vou dar uma facada. Não escrevi código para o Arduino, mas fiz muita programação em C e C ++. Ajudaria se eu realmente visse seus erros, mas mesmo assim.
A principal coisa que você precisa sempre lembrar ao usar C ++ com código C é que seu código C ++ precisa de funções declaradas com "extern" C "" se você quiser que o código C possa vincular-se ao código C ++. O "extern" C "" é o que informa ao compilador C ++ que estou criando código vinculável para arquivos C ou usando código de arquivos C. Portanto, todas as suas funções no cabeçalho da API da biblioteca devem se correlacionar com uma função no arquivo de origem definido como "extern" C "void dosomething ()". Se você estiver tentando usar classes em C ++, lembre-se de que o código C não pode chamá-lo, você precisará criar funções (extern "C") para acessar o objeto. Agora, se o seu código C for compilado com um compilador C ++, não se preocupe com o "C externo" "".
Se você deseja chamar o código C dentro do seu código C ++, precisará envolver o cabeçalho C com uma construção como esta:
Se você trabalha em C ++, não use muitos # define, a menos que esteja criando sinalizadores em tempo de compilação como "DEBUG" ou "VERSION2" para criar conjuntos especiais de código. Caso contrário, use "const int / char / float" para definir o número para verificação de tipo seguro. Os compiladores geralmente são inteligentes o suficiente para otimizá-los, então acabam no espaço ROM / código (depende). Além disso, não crie MACROS, use funções embutidas. Além disso, nem sempre siga as convenções ao programar, se for estúpido, como usar muitas macros e número definido em C ++. O mesmo se aplica à versão C99 do C99, que adicionou coisas como funções em linha e consts do C ++. O setor percebe quanto de código de buggy e difícil de manter vem do uso excessivo da linguagem do pré-processador.
O Eclipse geralmente armazena os arquivos obj em um diretório no seu projeto. Se você estiver criando uma compilação "Debug", ela estará localizada na pasta "Debug", na pasta do projeto. Se você estiver fazendo uma compilação "Release", procure em "Release", etc. Normalmente, uma compilação limpa só funciona para mim no Eclipse, então não sei o que está acontecendo de errado com sua configuração. Eu acho que verifique se você não está criando cabeçalhos pré-compilados.
fonte