msgstr "множественное определение 'SomeFuction'". Не знаю как починить - PullRequest
0 голосов
/ 30 сентября 2019

Я пишу приложение 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

protocol.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();

protocol.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();
}

В определенном смысле эти ошибки имеют смысл, так как protocol.h (и транзитивно FlexCAN_T4.h) включается несколько раз.

* 1024Но как я могу сохранить эту прекрасную организацию кода, которую мои обратные вызовы определили вне main.cpp? Как правильно включить эти зависимости?

Ответы [ 3 ]

0 голосов
/ 30 сентября 2019

Проблема в том, что flexcan_isr_can1 (и другие функции) определены в заголовочном файле, который включается в несколько единиц перевода. Это нарушение правила единого определения. К релевантным определениям функций должно быть добавлено ключевое слово inline.


Это дефект в библиотеке FlexCAN_T4;Вы должны отправить вопрос ответственному за библиотеку.

0 голосов
/ 14 октября 2019

У меня уже есть охранники, которые более рекомендуются, чем #pragma, и всегда были в файле H:

#if !defined(_FLEXCAN_T4_H_)
#define _FLEXCAN_T4_H_

Где находится дефект, который вы утверждаете, что видите?

0 голосов
/ 30 сентября 2019

Если связанные части FlexCAN_T4 не нужны в protocol.h, вы можете поместить их в файл cpp. Например, удалите следующую часть и поместите их в protocol.cpp:

include

extern FlexCAN_T4 flexCAN;

...