嵌入式系統的開發強加了另一種編碼方式。 爲了最大限度地減少名爲RF24Wave
的庫的大小,我將調整我的主類的結構。 這個想法是在我的程序庫包含在主程序中的時候聲明某些函數只有在某些#define
的存在。優化庫Arduino:未定義的參考
流行的庫,如MySensor
使用這種方式來最大限度地減少內存佔用。
所以,我有我的庫中有兩個文件:
RF24Wave.h
:頭文件包含函數聲明
#ifndef __RF24WAVE_H
#define __RF24WAVE_H
#include <arduino.h>
...
class RF24Wave
{
public:
/****** Common functions ******/
void begin();
#if !defined(WAVE_MASTER)
/****** Node functions ********/
void connect();
#else
/****** Master functions ******/
void printNetwork();
#endif
private:
bool synchronized = false;
}
RF24Wave.cpp
:包含函數源文件定義
#include "RF24Wave.h"
void begin()
{
//Body of my function
}
#if !defined(WAVE_MASTER)
void connect()
{
//Body of my function
}
#else
void printNetwork()
{
//Body of my function
}
#endif
其次,我包括我的主要素描這個庫命名爲master.cpp
,與#define WAVE_MASTER
:
master.cpp
:主草圖
#include <RF24.h>
#include <RF24Network.h>
#include <RF24Mesh.h>
#include <SPI.h>
#define WAVE_MASTER
#include <RF24Wave.h>
#include "master.h"
// Configure the chosen CE, CSN pins
RF24 radio(CE_PIN, CSN_PIN);
RF24Network network(radio);
RF24Mesh mesh(radio,network);
RF24Wave wave(network, mesh);
uint32_t displayTimer = 0;
void setup()
{
Serial.begin(115200);
wave.begin();
}
void loop()
{
wave.listen();
wave.printNetwork();
}
的目標是隻包括
master functions
當#define WAVE_MASTER
在主草圖中定義。
然而,我的主要草圖的編譯過程中,我有一個鏈接錯誤
In function `main':
undefined reference to `RF24Wave::printNetwork()'
collect2: error: ld returned 1 exit status
*** [.pioenvs/uno/firmware.elf] Error 1
我PlaformIO核心1.7.1編譯/ ATOM 1.13.0
最後,這個問題的原因是#define
的範圍。
此問題的解決方案是將編譯標誌添加到gcc編譯器!
如果使用組合PlatformIO/ATOM,您可以加入這一行到這個 配置文件
platformio.ini
:
build_flags = -D$NAME_DEFINE
在我們的例子:
build_flags = -DWAVE_MASTER
添加這條線後,建築看起來很好!
另外,通過這個選擇性#define
,我的程序庫減少了超過10%的佔用空間!
非常感謝您的幫助。
其中WAVE_MASTER是爲「master.cpp」定義的嗎?這是行不通的,因爲你無法控制你的代碼文件的定義。 (除非你使用編譯器選項,如果有的話) –
Arduino明確地不是C,也不完全是C++。 – Olaf
可能重複[什麼是未定義的引用/無法解析的外部符號錯誤,以及如何解決它?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external- symbol-error-and-how-do-i-fix) – Olaf