ローカルライブラリの読み込み


14

(JavaScript / Ruby環境から来た)Arduino / C開発は初めてですが、スケッチ内のカスタムフォルダからライブラリを含めることが可能かどうか疑問に思っていましたか?

これが私の状況です。

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の質問をもう一度読んでください。グローバルライブラリソリューションは知っていますが、プロジェクト内で使用したいです。
ステファン

最初にライブラリを見つける場所をIDEに指示する必要があり(前のリンクを参照)、スケッチ内でライブラリを呼び出します。`#include <LibraryName.h>`私が知る限り、2つを組み合わせincludeてpath / to / library /を指定する1つにすることはできません。
タイソン

さて、サブフォルダからのファイルを含めることはできません。それは残念です。
Stefan


2
Arduinoツールは、実際の、成熟した、またはプロフェッショナルなソフトウェアプラクティスと根本的に互換性がないという事実につまずいています。彼らはおそらく.gitディレクトリについて絶えず文句を言うでしょうが、実際にはビルドを壊すことはありません。
クリスストラットン

回答:


7

さて、ここでそれがどのように機能するかを確認しました。

確かにハードパスを使用できますが、すべてのプログラマーハードパスの使用を嫌います。それらはまったく移植性がなく、プログラムを所定の位置にロックします。プロジェクト内のファイルへのソフトリンクまたはハードリンクを使用します(「ln」のマニュアルページを参照してください)。しかし、... aboutい話をする!質問は、それを「正しく」行う方法です。重要なのは、C / C ++コンパイラーが実行するパラメーターとパスを学習することです。

結論はまったく直観的ではありません。追いかけ:相対パス正しく機能しません。今、なぜ?

しかし、最初に、プロジェクトディレクトリの外にプログラムファイルを配置する理由を説明しましょう。プログラマーは、プログラムクラス、構造体、メソッド、関数、マクロなどを1度だけ記述するのを好みます。プログラマーがプログラムの断片を固めるとすぐに、彼/彼女はファイルを共通ツリーに入れて先に進みたいと思っています。その後のすべてのプログラムは、そのプライベートライブラリを使用できます。また、ファイルを中央に配置することで、それぞれの複数のコピーとバージョンがなくなります。多くのプライベートプログラム用の1つのプライベートライブラリ。

1.6.13(Teensyはまだ1.8。*をサポートしていません)の時点で、相対インクルードはディレクトリではなくライブラリから開始されます。Arduinoツリーをインストールした場所から、ano-to-Cフィルター(Arduinoがターゲットに「変換」を行ってからC / C ++コンパイラーを呼び出すことを思い出してください)が開始されるようです。私の場合、「〜/ bin / arduino」にインストールしました。Teensyの家は "./hardware/teensy"です。ライブラリのホームパス全体は「〜/ bin / arduino / hardware / teensy / avr / libraries」であり、すべてのサポートプログラムツリーがあります。

ソースファイルでは、 '#include "test.hpp"'ステートメントは現在のディレクトリからファイルを正しく選択します。ただし、「#include "../test.hpp"」を使用すると、プロジェクトディレクトリでインクルードパスが開始されませ。代わりに、「./ libraries」で始まります!結果のパスは次のとおりです。

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

結論として、近くのディレクトリに独自のツールツリーを作成する明確な方法はありません。唯一のコースは、Arduinoライブラリで作業をコミットし、それらのルールも認識することです。


2

しばらくしてからarduinoを使用するようになりましたが、似たような問題に戸惑い、さまざまなサイトからのさまざまな情報やIDEのさまざまなバージョンの情報に戸惑っています。

私が見つけたのは、ディレクトリにスケッチがある場合、Ideをシャットダウンすると、ディレクトリに.h、.cpp ...ファイルをドロップでき、IDEを再起動するとスケッチで開かれるということです。

ファイル名に単純な引用符を使用して、パス、山括弧なしでそれらを含めます。

これは完全な答えの一部に過ぎないと確信していますが、私は始めました。


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

実際、新しいバージョンはより柔軟性があり、相対パスにライブラリを含めることができるようです。ただし、インクルードされたファイルにそれらの場所に関連する他のファイルも含まれている場合、まだ問題が発生しました
セバスチャン

うーん、私が書いたばかりのインクルードの問題は、パスとは関係ありません。Arduino IDEは* .ippファイルを適切に処理していないようです。このArduinoフォーラムのスレッドを
セバスチャン

Windowsの1.8.1では機能しません。
バイオレットキリン

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.