Я пишу приложение Arduino (используя platformIO в VSCode) и включаю внешнюю библиотеку CAN (FlexCAN_T4). Я хочу определить все мои обратные вызовы обработчика протоколов/сообщений в отдельном файле (protocol.cpp) и ссылаться на них из моего основного файла (main.cpp). Поэтому я создаю заголовочный файл (protocol.h) со всеми моими сигнатурами функций и включаю protocol.h как из protocol.cpp, так и из main.cpp.
Но я получаю "множественное определение `flexcan_isr_can1()'" (это функция, определенная в библиотеке, на которую ссылаются, FlexCAN_T4). Я не могу понять, как избавиться от этой ошибки, и при этом все мои сигнатуры функций, константы и многое другое работают должным образом.
Примеры сообщений об ошибках (по одному для каждой функции, не относящейся к классу, определенной в FlexCan_T4.h):
.pio/build/teensy40/src/protocol.cpp.o: In function `flexcan_isr_can1()':
protocol.cpp:(.text._Z16flexcan_isr_can1v+0x0): multiple definition of `flexcan_isr_can1()'
.pio/build/teensy40/src/main.cpp.o:main.cpp:(.text._Z16flexcan_isr_can1v+0x0): first defined here
/Users/pdesrosiers/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/bin/ld: Disabling relaxation: it will not work with multiple definitions
протокол.h
#pragma once
#include <FlexCAN_T4.h>
const uint8_t myConst = 100;
extern FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> flexCAN;
void myFunction();
протокол.cpp
#include "protocol.h"
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> flexCAN;
void myFunction()
{
//one of a hundred functions related to protocol, that should be defined outside of main.cpp.
flexCan.doSomething(myConst);
}
main.cpp
#include "protocol.h"
#include <Arduino.h>
void setup()
{
//some setup stuff...
}
void loop()
{
myFunction();
}
В определенном смысле эти ошибки имеют смысл, так как протокол.h (и, транзитивно, FlexCAN_T4.h) многократно #included.
Но как я могу сохранить эту прекрасную организацию кода, которую мои обратные вызовы определяют вне main.cpp? Как правильно включить эти зависимости?
<FlexCAN_T4.h>
есть определение функции, но нет#pragma once
- person Antti Haapala   schedule 30.09.2019