Неопределенная ссылка на функцию в пользовательской библиотеке
Здравствуйте, я создаю частную библиотеку Arduino, но мне трудно понять, как она связана. Почему этот файл h работает, но когда я перемещаю определение board_led в соответствующий файл c, он выдает ошибку при компиляции: В функциональном цикле: неопределенная ссылка на board_led(bool)
.
Я использую следующий менеджер платы для компиляции в Arduino IDE: https://raw.githubusercontent.com/maximintegratedmicros/arduino-collateral/master/package_maxim_index.json
Я использую следующую целевую плату: МАКСИМАЛЬНЫЕ 32-битные платы ARM> MAX32630FTHR
#pragma once
#include "Arduino.h"
#include <stdbool.h>
#include <gpio.h>
extern const gpio_cfg_t s_board_led;
extern void board_led(bool on) {
GPIO_OutPut( &s_board_led, on ? 0 : ~0 );
}
@dcdgo, 👍1
2 ответа
Лучший ответ:
Я подозреваю, что вы компилируете код на C ++ и включаете этот заголовок.
Когда C ++ ссылается на код C, код C ++ должен видеть внешнюю букву "C"
в объявлении или вокруг объявления (через внешнюю букву "C" { /* объявления функций */ }
)
Если вы компилируете код C ++ с кодом C (и связываете их вместе), попробуйте убедиться, что используется extern "C"
, например, так:
// arduino_lib.h
#pragma once
#include "Arduino.h"
#include <stdbool.h>
#include <gpio.h>
extern const gpio_cfg_t s_board_led;
extern "C" void board_led(bool on);
Пока в файле .c ничего не меняется
// arduino_lib.c
#include "arduino_lib.h"
const gpio_cfg_t s_board_led = /* некоторое значение */;
void board_leb(bool on) {
GPIO_OutPut( &s_board_led, on ? 0 : ~0 );
}
В дополнение к ответу Боба рекомендуется добавить защиту заголовка специально для обнаружения C ++:
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
// ваши определения функций здесь
#ifdef __cplusplus
}
#endif // __cplusplus
Таким образом, внешний "C"
применяется только в том случае, если файл заголовка включен в файл c ++, но не в том случае, если он включен в файл c.
- Как получить исходные файлы для библиотек Arduino?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Существуют ли библиотеки сглаживания сигналов для Arduino?
- Wire.h не найден!
- Библиотека FastLED: Как настроить яркость одного пикселя в абсолютном масштабе?
- Как эта строка кода определяет, подключен ли последовательный интерфейс?
- Ошибка Specified folder/zip file does not contain a valid library