2011-06-28 57 views
15

我想寫一個Arduino庫(有效的C++類),它本身引用另一個庫,我已經安裝在我的Mac的〜/ Documents/Arduino/libraries目錄中。是否有可能使用Arduino IDE從另一個庫中包含一個庫?

在我寫的庫的.cpp的頂部,我已經試過

#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包括目錄 (/硬件/工具/ avr/avr/include /), 以及任何庫目錄(在 /hardware/libraries /中),其中 包含主草圖文件包含的頭文件 。

這意味着,如果你#include "ReferencedLibrary.h"從你的主素描文件,這將導致被添加到包括路徑文件的目錄libraries其他庫中包括。有點黑客,但它在我的Mac上工作。

+1

這可能看起來像一個黑客,但它符合整個處理範例。基本上,一張素描是用來將所有工件拼接在一起的,因此提供草圖中的所有膠合邏輯是非常合適的。 – SRM

+14

這是「邪惡」。庫的概念是抽象的功能,並提供一個簡潔的API使用。 '#include「lib.h」'應該是獲取庫所需的全部(假設它在加載路徑中)。要求圖書館的客戶瞭解圖書館的內部運作情況顯然是錯誤的。 –

+0

有一些討論表示用戶必須在主草圖中包含所有參考庫。但是,即使執行此操作似乎也會爲宏或定義在依賴庫頭中的數組產生多個定義錯誤,並且排除依賴源文件中的頭會導致無法找到那些相同的符號。滿足庫依賴性的唯一方法是將所有頭文件和源代碼包含在同一個目錄中(或者遍歷所有包含語句,並將路徑更改爲相對路徑,這是包裝第三方庫時的難題,而且幾乎不可移植)。 –

3

根據我的理解,使用Arduino environement,您無法從您自己的其他庫中訪問自己的庫。沒有辦法添加路徑,所以編譯器無法找到代碼。這使得很難編寫在其他庫中使用代碼的庫。我的網絡研究表明這已經是多年的問題,但據我所知還沒有解決。我懷疑實施細節存在困難,或者可能希望以犧牲性能爲代價保持系統簡單。

當然,您可以隨時剪切並粘貼代碼到每個新庫中,但這是非常不理想的。您還可以在一對.h和.cpp文件中編寫一個包含所有代碼的大型庫。這也不是很令人滿意,但我偶爾也會這樣做。

然而,有一種解決方法是在自己的庫中使用標準的Arduino庫,並將其放置在Sketchbook/libraries目錄中。由於草圖包含標準庫位置的路徑,並鏈接標準庫代碼,因此可以在草圖中包含感興趣的標準庫的頭文件。在那之下,在你的草圖中,包含你自己的庫頭文件。標準庫隨後可用於您的圖書館以及草圖。

+0

查看@ julioterra的回答,它對我有用。 – vadipp

11

我已經能夠通過使用相對路徑在另一個Arduino庫中包含一個庫。例如,要包括AbstractSwitch庫到DigitalSwitch庫,假設這兩個庫的生活的Arduino的標準庫文件夾中自己單獨的文件夾,您可以使用下面的包括語句:

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

換句話說,您的包含聲明應顯示爲:

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

鏈接器階段出現'undefined reference'錯誤。它看起來像包含頭文件,但源文件沒有編譯或鏈接。 – Justin808

+1

同樣在這裏.. Arduino 1.0.5 ..這樣一個簡單的功能 - 沒有解決方案。 – flyandi

+0

@ Justin808你也可以用同樣的方式#include .cpp文件,這對我很有用。 –

相關問題