Неопределенная ссылка на функцию в пользовательской библиотеке

Здравствуйте, я создаю частную библиотеку 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 );
}

, 👍1


2 ответа


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

5

Я подозреваю, что вы компилируете код на 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 );
}
,

3

В дополнение к ответу Боба рекомендуется добавить защиту заголовка специально для обнаружения C ++:

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

// ваши определения функций здесь

#ifdef __cplusplus
}
#endif // __cplusplus

Таким образом, внешний "C" применяется только в том случае, если файл заголовка включен в файл c ++, но не в том случае, если он включен в файл c.

,