Вызов функций из массива указателей в библиотеке вызывает ошибку «неопределенная ссылка на»
Я пытаюсь создать библиотеку, в которой у меня есть массив указателей на функции. Этот массив используется другими функциями в библиотеке. Это код заголовочного файла:
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() {}
У меня нет ошибок. В чем проблема?
@LukasFun, 👍0
1 ответ
Лучший ответ:
void (*caller[2])();
должно быть:
void (*Lib::caller[2])();
Поскольку вы определяете место для хранения статической переменной-члена, вы должны сообщить компилятору, членом какого класса она является.
- Передача ссылки на объект NeoPixel в пользовательскую библиотеку
- Разбор массива объекта в конструкторе библиотеки
- Как получить исходные файлы для библиотек Arduino?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Существуют ли библиотеки сглаживания сигналов для Arduino?
- Wire.h не найден!
- Библиотека FastLED: Как настроить яркость одного пикселя в абсолютном масштабе?
Спасибо, это решает часть о неопределенной ссылке. Как из этого возникает проблема с несколькими библиотеками?, @LukasFun
Возможно, потому что у вас где-то есть две библиотеки с именем Lib.h?, @Majenko
(кстати, я не говорю по-немецки, поэтому сначала понятия не имел, о чем вы говорили о нескольких библиотеках...), @Majenko
Нет, есть только один файл Lib.h. Самое смешное, что, как я и писал, эта ошибка пропадает, если не вызывать функцию в скетче. И это также уходит с вашим решением. Мне просто было интересно, откуда он взялся., @LukasFun
Вероятно, какая-то ошибка в IDE тогда..., @Majenko