У меня следующая проблема:
Я пишу коллекционную библиотеку для набора датчиков, которые будут использоваться с микроконтроллером. Это значит, что я беру много библиотек для датчиков и абстракций и немного упрощаю их в единой библиотеке для студенческого проекта.
Я использую #define
структуры, чтобы выяснить, какие датчики студенты хотят использовать и подключить.
Пример:
#define IR_SENSOR_USED
В файлах библиотеки .h и .cpp я затем использую пары #ifdef
- #endif
для определения и объявления функций для данного датчика, а также для включения указанных библиотек.
Пример из моего Sensors.h
файла:
#ifdef IR_SENSOR_USED
#include "SparkFun_GridEYE_AMG88/src/SparkFun_GridEYE_Arduino_Library.h"
extern GridEYE grideye;
void setup_ir_sensor();
void read_ir_sensor();
void enable_ir_interrupt(float lower, float upper, float hysteresis);
void disable_ir_interrupt();
#endif
и из моего Sensors.cpp
файла:
#ifdef IR_SENSOR_USED
void setup_ir_sensor() {
Wire.begin(16, 17, 0x69);
grideye.begin(0x69, Wire);
}
void read_ir_sensor() {
for (int i = 0; i <= 64; i++) {
sensor_values.ir_pixel_temp[i] = grideye.getPixelTemperature(i);
}
sensor_values.ir_device_temp = grideye.getDeviceTemperature();
}
void enable_ir_interrupt(float lower, float upper, float hysteresis) {...}
void disable_ir_interrupt() {...}
#endif
Однако, пока у меня есть #ifdef
в файле .cpp, я получаю следующую ошибку, если пытаюсь вызвать функцию в setup()
:
sketch/Sensors.ino.cpp.o:(.literal._Z5setupv+0xc): undefined reference to `read_ir_sensor()'
sketch/Sensors.ino.cpp.o: In function `setup()':
.../Sensors/Sensors.ino:112: undefined reference to `read_ir_sensor()'
collect2: error: ld returned 1 exit status
exit status 1
Если я их закомментирую, код выполняется нормально. Другая функция (setup_sensors()
), которая также находится в файлах Sensors.h
и .cpp
и не окружена #ifdef
, также работает нормально.
Это мой Sensors.ino
набросок:
#define IR_SENSOR_USED
//#define COLOR_SENSOR_USED
//#define ENV_SENSOR_USED
//#define TEMP_SENSOR_USED
#include "Sensors.h"
void setup() {
sensor_setup();
read_ir_sensor();
}
void loop() {
}
В чем причина? (Почему) препроцессор не выполняет директивы в файле .cpp должным образом?