У меня есть следующая проблема:
Я пишу библиотеку для набора датчиков, которые будут использоваться с микроконтроллером. То есть я беру много библиотек для датчиков и немного абстрагирую и упрощаю их в унифицированную библиотеку для студенческого проекта.
Я использую структуры #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?
Sensors.cpp
(или объектным файлом, созданным из него)? А макросIR_SENSOR_USED
определен для всех исходных файлов? - person Some programmer dude   schedule 06.03.2019#define IR_SENSOR_USED
? - person AMA   schedule 06.03.2019Sensors.ino
у меня есть#define IR_SENSOR_USED
в качестве первой строки, прежде чем у меня есть#include "Sensors.h"
- person Lithimlin   schedule 06.03.2019Sensors.cpp
? Помните, что ваши исходные файлы создаются отдельно и что директивы препроцессора (например, определения макросов) предназначены только для одного единицы перевода. - person Some programmer dude   schedule 06.03.2019Sensors.h
. Другой вариант — задать определение для всего проекта через настройки проекта. Я не знаю, как именно это делается для проектов Arduino. - person AMA   schedule 06.03.2019