【发布时间】:2019-03-06 10:56:17
【问题描述】:
我有以下问题:
我正在为一组与微控制器一起使用的传感器编写一个集合库。这意味着我使用了很多传感器库,并在学生项目的统一库中对它们进行了抽象和简化。
我使用#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
但是,只要我在 .cpp 文件中有 #ifdef,如果我尝试调用 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是为所有源文件定义的? -
#define IR_SENSOR_USED在哪里? -
在我的
Sensors.ino中,第一行是#define IR_SENSOR_USED,然后是#include "Sensors.h" -
所以在构建
Sensors.cpp时没有定义?请记住,您的源文件是单独构建的,并且预处理器指令(如宏定义)仅适用于单个translation units。 -
不是这样吗?我以为这会奏效。如果不是这样,我的整个方法就有点没用了,不是吗?我还能如何完成我想做的事情?
标签: c++ arduino c-preprocessor undefined-reference esp32