Carregando bibliotecas locais

14

Eu sou novo no desenvolvimento do Arduino / C (proveniente de um ambiente JavaScript / Ruby), mas queria saber se era possível incluir uma biblioteca de uma pasta personalizada dentro de um esboço?

Então esta é a minha situação;

project.ino
libs/
  MyNewLib/
    MyNewLib.h
    MyNewLib.ccp

Agora, minha pergunta é: como posso incluir minha biblioteca personalizada? Eu tentei várias variações sobre isso;

# project.ino

#include <libs/MyNewLib/MyNewLib.h>
#include "libs/MyNewLib/MyNewLib.h"
#include <./libs/MyNewLib/MyNewLib.h>
#include "./libs/MyNewLib/MyNewLib.h"

Mas nenhum deles funciona. Alguém pode me dizer se isso é possível? Analisei essa questão na Web, mas não encontro nenhuma resposta satisfatória. Espero que vocês possam ajudar.

Felicidades.

ATUALIZAR

Estou ciente de que você pode colocar suas bibliotecas na sua pasta global de bibliotecas, mas eu as quero na minha pasta local do projeto. Quero compartilhá-los através do git com minha equipe.

Stefan
fonte
3
Por favor, leia minha pergunta novamente @Tyson. Estou ciente da solução global de bibliotecas, mas as quero dentro do meu projeto.
Stefan
Você deve primeiro informar ao IDE onde encontrar a biblioteca (consulte o link anterior) e, em seu esboço, você chamará a biblioteca. `#include <LibraryName.h>` AFAIK, você não pode combinar os dois em um único includeespecificando o caminho / to / library /, que é o que eu acho que você está perguntando.
Tyson
Ok, então eu não posso incluir arquivos de subpastas .. Que pena ..
Stefan
2
Você está tropeçando no fato de que as ferramentas do Arduino são fundamentalmente incompatíveis com práticas de software reais, maduras ou profissionais. Eles provavelmente também se queixarão incessantemente desse diretório .git, embora ele realmente não interrompa a compilação.
Chris Stratton

Respostas:

7

Ok, aqui está como funciona, e eu verifiquei para ter certeza.

Claro que você pode usar caminhos rígidos, mas todo programador odeia usar caminhos rígidos. Eles não são portáteis e bloqueiam seu programa no lugar. Você usa links flexíveis ou físicos para os arquivos no projeto (consulte as páginas de manual em "ln"). Mas ... fale sobre feio! Então a questão é como fazê-lo "corretamente"? A chave é aprender com quais parâmetros e em que caminho o compilador C / C ++ é executado.

Você verá que a conclusão NÃO é intuitiva. Indo direto ao ponto: caminhos relativos não funcionam corretamente. Agora porque?

Mas primeiro, deixe-me explicar por que alguém iria querer colocar arquivos de programa fora do diretório do projeto. Os programadores gostam de escrever classes, estruturas, métodos, funções, macros etc., uma vez. Assim que o programador solidificar o fragmento do programa, ele / ela deseja colocar os arquivos em uma árvore comum e seguir em frente. Todos os programas posteriores poderiam usar essa biblioteca privada. Além disso, ao ter os arquivos em um local central, você não terá várias cópias e versões de cada. Uma biblioteca privada para muitos programas particulares.

A partir da versão 1.6.13 (o Teensy ainda não suporta 1.8. *), O relativo inclui o início da biblioteca , não o seu diretório. Parece que o filtro de ano para C (lembre-se de que o Arduino faz uma "conversão" no destino e depois chama o compilador C / C ++) começa onde você instalou sua árvore do Arduino. No meu caso, eu instalei no "~ / bin / arduino". A casa de Teensy é "./hardware/teensy". O caminho inicial completo para as bibliotecas é "~ / bin / arduino / hardware / teensy / avr / libraries", onde você encontrará todas as árvores do programa de suporte.

Em um arquivo de origem, a instrução '#include "test.hpp"' seleciona corretamente o arquivo do diretório atual. No entanto, se você usar '#include "../test.hpp",' o caminho de inclusão não será iniciado no diretório do projeto. Em vez disso, começa em "./libraries"! Portanto, o caminho resultante é:

#include "../test.hpp" ==> ./arduino/hardware/teensy/avr/libraries/test.hpp

Em conclusão, não há uma maneira limpa de criar sua própria árvore de ferramentas em um diretório próximo. O único curso é comprometer seu trabalho na biblioteca do Arduino e estar ciente dessas regras também.

Sean Walton
fonte
2

Acabei de voltar a usar o arduino depois de algum tempo e estou um pouco confuso com problemas semelhantes e confuso com informações diferentes de sites diferentes e versões diferentes do ide.

O que descobri é que, se você tiver um rascunho em um diretório, desligue a Ide e solte os arquivos .h, .cpp ... no diretório e o ide, quando reiniciado, os abrirá com o rascunho.

Inclua-os usando aspas simples nos nomes dos arquivos, sem caminho, sem colchetes angulares.

Estou certo de que isso é apenas parte da resposta completa, mas isso já me deu início.

russ_hensel
fonte
2

Tanto quanto eu sei, você pode incluir suas bibliotecas de um local personalizado usando o caminho absoluto.

Como os caminhos absolutos podem ser chatos do ponto de vista da portabilidade de código, você pode definir algumas macros para obter o caminho absoluto de um dado relativo. Dessa forma, você precisaria apenas corrigir o caminho da 'raiz do projeto' ao passar de um dispositivo para outro.

Defina a pasta raiz do seu projeto:

    #define PROJECT_ROOT C:\path\to\your\project\folder

Defina uma macro 'transformação' relativa ao absoluto:

    #define TO_STRING(s) #s
    #define ABSOLUTE_PATH(root, relative_path) TO_STRING(root\relative_path)
    #define RELATIVE_PATH(library) ABSOLUTE_PATH(PROJECT_ROOT, library)

Inclua seus arquivos usando o caminho relativo:

    #include RELATIVE_PATH(some\file\relative\path.h)
    #include RELATIVE_PATH(another\file\relative\path.h)

Espero que seja útil.

Lorenzo Addazi
fonte
2

O plug-in do Arduino para Visual Studio suporta bibliotecas locais. Você pode encontrar o plug-in aqui

Visual Micro
fonte
2

Testei recentemente essa estrutura de biblioteca local. Trabalha com:

#include "libs/MyNewLib/MyNewLib.h"

O pré-processamento do Arduino IDE 1.6.7 compila até o código-fonte da biblioteca.

Felicidades!

Mikael Patel
fonte
1
Deve ser novo no 1.6.7
James Newton
Parece que, de fato, as versões mais recentes são mais flexíveis e você pode incluir bibliotecas em caminhos relativos. No entanto, eu ainda tive problemas quando os arquivos incluídos também incluem outros arquivos relativos à sua localização.
22416 Sebastian
Hum, os problemas de inclusão que acabei de escrever não estão relacionados a caminhos. Parece que o IDE do Arduino não lida bem com arquivos * .ipp. Veja este tópico do fórum do arduino
Sebastian
Não funciona para mim no 1.8.1 no Windows.
Girafa Violeta
1

A maneira mais simples de encontrar isso é armazenar as bibliotecas no diretório de esboço local e criar um link simbólico no diretório [HOME] / Arduino / libraries. Depois, você pode acessá-los facilmente no Git com seu esboço / projeto e o Arduino ainda está feliz porque as bibliotecas estão acessíveis na pasta global.

Talvez até crie um script de instalação que crie esses links automaticamente e verifique isso também no Git.

Matt Ball
fonte
0

Outra correção realmente ruim - crie um arquivo chamado libraries.cpp, que contém:

// force the linker to build the libraries
#include "libraries/LIB1/src/FILE1.cpp"
#include "libraries/LIB1/src/FILE2.cpp"
#include "libraries/LIB2/src/FILE1.cpp"

Obviamente, isso só funciona se a biblioteca não contiver nenhuma inclusão ...

Eric
fonte