Ошибка «Неопределенная ссылка» во время компиляции для функций, определенных в исходном файле .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).

, 👍0

Обсуждение

Ну, например, в 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


1 ответ


Лучший ответ:

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 ...
}
,