Ошибка «Неопределенная ссылка» во время компиляции для функций, определенных в исходном файле .cpp, которые вызываются в моем основном файле проекта
В настоящее время я работаю с NodeMCU ESP12E и IMU MPU6050, используя Arduino IDE, и хотел создать проект с файлом .h, в котором объявляются переменные и функции. В файле .cpp у меня есть различные определения функций. Файл main.ino просто вызывает некоторые из этих функций. Пожалуйста, найдите несколько фрагментов кода из каждого файла и ошибки, с которыми я столкнулся. В ошибках говорится, что три функции, вызываемые в файле .ino, не определены, хотя они определены в файле .cpp
Файл Algo.h:
extern int activity_state; // activity_state=1 для БЕГА и activity_state=0 для ХОДЬБЫ
extern float * speedarray; // Динамический массив для хранения скорости
extern int speedindex;
extern float * timearray; // Динамический массив для хранения времени
extern int timeindex;
extern unsigned int localPort;
Algo.cpp:
static void pedometerInit() // Инициализация всех переменных алгоритма шагомера { интервал я = 0; //переменные pedometerAlgo pedi_window_high = 2000; pedi_window_low = 200; pedi_sampling_counter = 0; pedi_refresh_frequency = 50; допустимая зона = 1; джатин_индекс_1 = 0; джатин_маг = 0; педи_макс = 0; . .
Все функции работают с переменными, объявленными в заголовочном файле.
Ped_algo.ino:
static void pedometerInit() // Initialising all pedometer algorithm variables
{
int i = 0;
//pedometerAlgo varibles
pedi_window_high = 2000;
pedi_window_low = 200;
pedi_sampling_counter = 0;
pedi_refresh_frequency = 50;
validZone = 1;
jatin_index_1 = 0;
jatin_mag = 0;
pedi_max = 0;
.
.
Сообщения об ошибках:
Ped_Algo.ino.cpp.o:(.text.loop+0x0): неопределенная ссылка на pedometerAlgo()'
в функции
loop':
неопределенная ссылка на pedometerInit()'
неопределенная ссылка на
MPU6050_Init()'
неопределенная ссылка на `pedometerInit()'
Ошибка компиляции для платы NodeMCU 1.0 (модуль ESP-12E).
@dkr, 👍0
Обсуждение1 ответ
Лучший ответ:
Во-первых, static
предотвращает глобальный экспорт функции:
static void pedometerInit() // Инициализация всех переменных алгоритма шагомера
не должен быть static
.
Во-вторых, extern
не определяет переменную, он просто сообщает компилятору, что "эта переменная где-то существует. Найдите ее во время компоновки". - однако вы фактически нигде не определяете эти переменные. В дополнение к подсказкам extern
в файле .h
вам необходимо иметь переменные в файле .cpp
, чтобы компилятор мог найти их.
int activity_state; // activity_state=1 для БЕГА и activity_state=0 для ХОДЬБЫ
float * speedarray; // Динамический массив для хранения скорости
int speedindex;
float * timearray; // Динамический массив для хранения времени
int timeindex;
unsigned int localPort;
void pedometerInit() // Инициализация всех переменных алгоритма шагомера
{
... your code ...
}
- Передача функции-члена класса в качестве аргумента
- esp32 Stack canary watchpoint срабатывает
- Преобразование byte* в int в Arduino
- Веб-сервер ESP8266 не отвечает (тайм-аут подключения)
- Прошивать NodeMCU с помощью .ino-файла?
- ESP8266 SPIFFS не сохраняется правильно?
- C++ против языка Arduino?
- Как читать и записывать EEPROM в ESP8266
Ну, например, в
static void pedometerInit()
этотstatic
означает, что компоновщику не разрешено использовать его вне своего собственного модуля компиляции Algo.cpp (Algo.o), @KIIVКроме того, кажется, что у вас не реализован конструктор
pedometerAlgo::pedometerAlgo()
., @Michel Keijzersвы включили Algo.h в .ino?, @Juraj
Я включил Algo.h в файл .ino. Кроме того, я не использую здесь классы. И удаление статики дает мне неопределенную ошибку ссылки на все переменные, используемые в функциях., @dkr
Помимо extern в заголовке для ваших переменных, вы должны где-то создать эти переменные. extern просто t сообщает компилятору, что они существуют где-то еще. Вы должны убедиться, что они действительно где-то существуют., @Majenko