2011-06-28 5 views
15

私はMacの〜/ Documents/Arduino/librariesディレクトリにインストールした別のライブラリを参照するArduinoライブラリ(事実上C++クラス)を作成しようとしています。私が書いているライブラリの.cppファイルの上部にArduino IDEを使用して別のライブラリのライブラリを含めることは可能ですか?

は、私はどちらも仕事の...

#include <ReferencedLibrary.h> 

#include "ReferencedLibrary.h" 

を試してみました。私は〜/ Documents/Arduinoディレクトリのスケッチから正常に#include <ReferencedLibrary.h>することができます。私は何かを見逃しているのですか、これはArduino IDE/makefileの制限ですか?回避策はありますか?

答えて

6

この問題は、Arduino 1.6.6リリースで解決されました。 1.6.6のリリースノートには、ライブラリとライブラリの依存関係が修正されていることが記載されています。ライブラリの依存関係に

図書館:あなたのスケッチは、ライブラリをインポートし、そのライブラリが別のものを使用する場合、IDEは、あなたのスケッチにバージョンを更新

を無用の#includeを追加することなく出ています1.6.6以上にアップグレードすると問題が解決されます。

10

ここhttp://www.arduino.cc/en/Hacking/BuildProcess状態のドキュメント:

ザ・パスを含めるにはスケッチの ディレクトリが含まれ、ターゲットディレクトリ (/ハードウェア/コア//)とAVR には、ディレクトリ (/ハードウェア/ツール/ )と ( /hardware/libraries /内)の には、メインスケッチファイルに含まれるヘッダファイルが含まれています。

これは、あなたのメインのスケッチファイルから#include "ReferencedLibrary.h"、これが生じた場合、他のライブラリが含まれるようにするために、そのファイルのlibrariesディレクトリが含まパスに追加取得することを意味します。ハックのビットが、私のMac上で動作します。

+1

ハックのように見えるかもしれませんが、全体の処理パラダイムに一致します。基本的にスケッチとは、すべての作業要素を融合するために使用するものであり、スケッチ内のすべてのグルーロジックを非常に適切なものにすることです。 – SRM

+14

これは「悪」です。ライブラリのアイデアは、機能を抽象化し、簡潔なAPIを使用して使用することです。 '#include" lib.h "'はライブラリを取得するために必要なものでなければなりません(ロードパスにあると仮定します)。ライブラリのクライアントがライブラリの内部動作を知ることを要求することは、まったく間違っています。 –

+0

ユーザは、参照されたすべてのライブラリをメインスケッチに含める必要があるとの議論があります。しかし、このようにしても、依存ライブラリーヘッダーで定義されているマクロまたは配列の複数の定義エラーが生成され、依存ソースファイルのヘッダーを除外すると、それらの同じ記号を見つけることができません。ライブラリの依存関係を満たすための唯一の方法は、すべてのヘッダとソースを同じディレクトリに含めることです(あるいは、すべてのinclude文を実行し、相対パスに変更します。 –

3

私が理解しているように、Arduino環境を使用すると、自分の別のライブラリから別のライブラリにアクセスすることはできません。パスを追加する方法はないので、コンパイラがコードを見つける方法はありません。そのため、別のライブラリにコードを使用するライブラリを作成することが難しくなります。私のウェブ調査によると、これは何年もの間問題となっていたが、私の知識には解決されていないことが示されている。私は実装の詳細に困難があるか、おそらく能力を犠牲にしてシステムを単純に保つという願望があると思う。

もちろん、新しいライブラリにコードをカット&ペーストすることはできますが、それは非常に最適ではありません。また、すべてのコードを1つの巨大なライブラリ(.hと.cppファイル)で記述することもできます。それはあまり満足できるものではありませんが、私は時々それをしました。

しかし、自分のライブラリに標準のArduinoライブラリを使用して、あなたのスケッチブック/ライブラリディレクトリに置いておくことはできません。スケッチには標準ライブラリの場所へのパスが含まれており、標準ライブラリコードをリンクするため、スケッチに関心のある標準ライブラリのヘッダファイルを含めることができます。その下に、あなたのスケッチでも、独自のライブラリヘッダーファイルを含めます。スタンダードライブラリは、ライブラリとスケッチで利用できるようになります。

+0

@ julioterraの答えを参照してください、それは私のために働いた。 – vadipp

11

私は、相対パスを使用して別のArduinoライブラリにライブラリを含めることができました。例えば、これらのライブラリの両方がアルドゥイーノの標準ライブラリフォルダ内に自身の個別のフォルダに住んでいると仮定して、DigitalSwitchライブラリにAbstractSwitchライブラリが含まれるように、次の文としては、以下を使用することができます。つまり

#include "../AbstractSwitch/AbstractSwitch.h" 

を、インクルードステートメントは、次のようになります。

#include "../LibraryFolder/LibraryHeaderFile.h" 
+1

リンカ段階で '未定義の参照 'エラーが発生しました。ヘッダーはインクルードされているようですが、ソースファイルはコンパイルまたはリンクされていません。 – Justin808

+1

Arduino 1.0.5 ..このようなシンプルな機能はありません。 – flyandi

+0

@ Justin808同様に#cppファイルを#includeすることもできます。 –

関連する問題