Вызов функций из массива указателей в библиотеке вызывает ошибку «неопределенная ссылка на»

Я пытаюсь создать библиотеку, в которой у меня есть массив указателей на функции. Этот массив используется другими функциями в библиотеке. Это код заголовочного файла:

class Lib {
  public:
    static void call();
    static void (*caller[])();
  private:
};

Это код .cpp-файла:

#include "Lib.h"

void (*caller[2])();

void Lib::call() {
  caller[0]();
}

Скетч, выполняющий это

#include <Lib.h>

void setup() {
  Lib::call();
}

void loop() {}

Когда я пытаюсь скомпилировать это, я получаю следующую ошибку:

неопределенная ссылка на `Lib::caller'
collect2: ошибка: ld вернул 1 статус выхода
Mehrere Bibliotheken wurden für "Lib.h" gefunden

Еще одна странность заключается в том, что ошибка о множестве найденных библиотек исчезает, если я убираю строку

Lib::call();

Однако, если я вставлю тот же код непосредственно в скетч следующим образом:

void (*caller[2])();

void call() {
  caller[0]();
}

void setup() {
  call();
}

void loop() {}

У меня нет ошибок. В чем проблема?

, 👍0


1 ответ


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

0
void (*caller[2])();

должно быть:

void (*Lib::caller[2])();

Поскольку вы определяете место для хранения статической переменной-члена, вы должны сообщить компилятору, членом какого класса она является.

,

Спасибо, это решает часть о неопределенной ссылке. Как из этого возникает проблема с несколькими библиотеками?, @LukasFun

Возможно, потому что у вас где-то есть две библиотеки с именем Lib.h?, @Majenko

(кстати, я не говорю по-немецки, поэтому сначала понятия не имел, о чем вы говорили о нескольких библиотеках...), @Majenko

Нет, есть только один файл Lib.h. Самое смешное, что, как я и писал, эта ошибка пропадает, если не вызывать функцию в скетче. И это также уходит с вашим решением. Мне просто было интересно, откуда он взялся., @LukasFun

Вероятно, какая-то ошибка в IDE тогда..., @Majenko