로컬 라이브러리로드


14

Arduino / C 개발에 익숙하지 않지만 (JavaScript / Ruby 환경에서 제공) 스케치 내에 사용자 정의 폴더의 라이브러리를 포함시킬 수 있는지 궁금합니다.

이것이 나의 상황입니다.

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

이제 내 질문은 : 사용자 정의 라이브러리를 어떻게 포함시킬 수 있습니까? 나는 이것에 몇 가지 변형을 시도했다.

# project.ino

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

그러나 그들 중 누구도 작동하지 않습니다. 이것이 가능한지 말해 줄 수 있습니까? 웹 에서이 질문을 살펴 보았지만 만족스러운 답변을 찾을 수 없습니다. 잘하면 당신이 도울 수 있습니다.

건배.

최신 정보

전역 라이브러리 폴더에 라이브러리를 넣을 수 있다는 것을 알고 있지만 로컬 프로젝트 폴더에 라이브러리를 원합니다. git을 통해 팀과 공유하고 싶습니다.


3
@Tyson에서 내 질문을 다시 읽으십시오. 글로벌 라이브러리 솔루션을 알고 있지만 프로젝트 내에서 라이브러리를 원합니다.
Stefan

먼저 IDE에 라이브러리를 찾을 위치를 지정해야하고 (이전 링크 참조) 스케치 내에서 라이브러리를 호출해야합니다. `#include <LibraryName.h>`AFAIK 두 가지를 include경로 / 경로 / 라이브러리 /를 지정하여 단일으로 결합 할 수는 없습니다 .
타이슨

좋아, 그래서 나는 하위 폴더에서 파일을 포함 할 수 없습니다. 그것은 유감입니다.
Stefan


2
Arduino 도구는 실제, 성숙하거나 전문적인 소프트웨어 관행과 근본적으로 호환되지 않는다는 사실에 걸림돌이되고 있습니다. 또한 실제로 .git 디렉토리에 대해 끊임없이 불만을 제기하지만 실제로 빌드를 중단하지는 않습니다.
Chris Stratton

답변:


7

자, 여기 그것이 어떻게 작동하는지, 나는 그것을 확인하기 위해 확인했습니다.

물론 하드 경로를 사용할 수 있지만 모든 프로그래머는 하드 경로를 사용하는 것을 싫어 합니다. 그것들은 전혀 이식성이 없으며 프로그램을 제자리에 고정시킵니다. 프로젝트의 파일에 대한 소프트 링크 또는 하드 링크를 사용합니다 ( "ln"의 매뉴얼 페이지 참조). 하지만 ... 못생긴 얘기! 문제는 "올바로"하는 방법입니다. 핵심은 C / C ++ 컴파일러가 실행하는 매개 변수와 경로를 학습하는 것입니다.

결론이 전혀 직관적이지 않다는 것을 알게 될 것입니다. 추적으로 절단 : 상대 경로 올바르게 작동 하지 않습니다 . 왜?

그러나 먼저 누군가 왜 프로젝트 파일을 프로젝트 디렉토리 외부 에 배치하려고하는지 설명하겠습니다 . 프로그램 클래스, 구조체, 메소드, 함수, 매크로 등을 한 번 작성하는 프로그래머 프로그래머가 프로그램 조각을 확정하자마자 파일을 공통 트리에 넣고 계속 진행하려고합니다. 이후 모든 프로그램은 해당 개인 라이브러리를 사용할 수 있습니다. 또한 파일을 중앙 위치에두면 각각의 사본과 버전이 여러 개 없습니다. 많은 개인 프로그램을위한 하나의 개인 라이브러리.

1.6.13부터 (Teensy는 아직 1.8. *를 지원하지 않음) relative는 디렉토리가 아닌 라이브러리 에서 시작 합니다. Arduino 트리를 설치 한 위치에서 Arno-to-C 필터 (Arduino가 대상에 대한 "변환"을 수행 한 다음 C / C ++ 컴파일러를 호출 함을 기억하십시오)가 시작되는 것으로 보입니다. 제 경우에는 "~ / bin / arduino"에 설치했습니다. Teensy의 집은 "./hardware/teensy"입니다. 라이브러리의 전체 홈 경로는 "~ / bin / arduino / hardware / teensy / avr / libraries"이며 모든 지원 프로그램 트리를 찾을 수 있습니다.

소스 파일에서 '#include "test.hpp"'문은 현재 디렉토리에서 파일을 올바르게 선택합니다. 그러나 '#include "../test.hpp"'를 사용하면 프로젝트 디렉토리에서 포함 경로가 시작 되지 않습니다 . 대신 "./ 라이브러리"로 시작합니다! 결과 경로는 다음과 같습니다.

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

결론적으로 가까운 디렉토리에 자신 만의 도구 트리를 만드는 확실한 방법은 없습니다. 유일한 코스는 Arduino 라이브러리에서 작업을 커밋하고 해당 규칙을 인식하는 것입니다.


2

나는 얼마 후 아두 이노를 사용하여 돌아 왔고 비슷한 문제로 인해 다소 혼란 스러웠으며 다른 사이트의 다른 정보와 다른 버전의 아이디어에 대해 혼란스러워했습니다.

내가 찾은 것은 디렉토리에 스케치가 있고 Ide를 종료하면 디렉토리에 .h, .cpp ... 파일을 드롭 할 수 있으며 다시 시작할 때 스케치로 파일을 열 수 있다는 것입니다.

파일 이름에 경로, 꺾쇠 괄호없이 간단한 따옴표를 사용하여 포함하십시오.

나는 이것이 완전한 대답의 일부일 것이라고 확신하지만 그것은 시작되었다.


2

내가 아는 한 절대 경로를 사용하여 라이브러리를 사용자 정의 위치에서 포함시킬 수 있습니다.

절대 경로는 코드 이식성 관점에서 지루할 수 있으므로 특정 상대 경로에서 절대 경로를 가져 오도록 일부 매크로를 정의 할 수 있습니다. 이런 식으로 장치에서 다른 장치로 전달할 때 '프로젝트 루트'경로를 수정하면됩니다.

프로젝트의 루트 폴더를 정의하십시오.

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

상대-절대 매크로 '변환'을 정의하십시오.

    #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)

상대 경로를 사용하여 파일을 포함하십시오.

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

도움이 되길 바랍니다.



2

최근에이 로컬 라이브러리 구조를 테스트했습니다. 그것은 작동합니다 :

#include "libs/MyNewLib/MyNewLib.h"

Arduino IDE 1.6.7 빌드 전처리는 라이브러리의 소스 코드를 선택합니다.

건배!


1
1.6.7의 새로운 버전이어야합니다
James Newton

실제로 최신 버전이 더 융통성이 있으며 상대 경로에 라이브러리를 포함시킬 수 있습니다. 포함 된 파일도를 기준으로 다른 파일 포함 그러나 나는 여전히 문제로 실행 자신의 위치를.
Sebastian

흠 방금 작성한 포함 문제는 경로와 관련이 없습니다. Arduino IDE는 * .ipp 파일을 잘 처리하지 못하는 것 같습니다. 이 arduino 포럼 스레드보기
Sebastian

Windows의 1.8.1에서는 작동하지 않습니다.
Violet Giraffe

1

가장 간단한 방법은 라이브러리를 로컬 스케치 디렉토리에 저장하고 [HOME] / Arduino / libraries 디렉토리에 심볼릭 링크를 만드는 것입니다. 그런 다음 스케치 / 프로젝트를 사용하여 Git에 쉽게 체크인 할 수 있으며 라이브러리는 전역 폴더에서 액세스 할 수 있기 때문에 Arduino는 여전히 행복합니다.

어쩌면 이러한 링크를 자동으로 생성하는 설치 스크립트를 만들어 Git에 체크인 할 수도 있습니다.


0

또 다른 나쁜 수정-이라는 파일을 작성하십시오 libraries.cpp.

// 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"

물론 이것은 라이브러리 자체에 포함이 포함되어 있지 않은 경우에만 작동합니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.