我正在编写一个Arduino应用程序(在VSCode中使用platformIO),并包括一个外部CAN库(FlexCAN_T4)。我想在一个单独的文件(protocol.cpp)中定义所有协议/消息处理程序回调,并从我的主文件(main.cpp)中引用它们。因此,我创建了一个带有所有功能签名的头文件(protocol.h),并包含来自protocol.cpp和main.cpp的protocol.h。
但是我得到“ 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)被多次包含。
但是,如何保持这种不错的代码组织(我的回调在main.cpp之外定义)?包含这些依赖项的正确方法是什么?
答案 0 :(得分:0)
如果protocol.h中不需要FlexCAN_T4相关部件,则可以将其放在cpp文件中。 例如删除以下部分并将其放入protocol.cpp:
外部FlexCAN_T4 flexCAN;
答案 1 :(得分:0)
问题在于flexcan_isr_can1
(和其他函数)是在包含在多个翻译单元中的头文件中定义的。这违反了一个定义规则。 relevant函数定义应添加inline
关键字。
这是FlexCAN_T4库中的缺陷;您应该将问题提交给图书馆的维护者。
答案 2 :(得分:0)
我已经有了include防护,与#pragma相比,我们推荐使用它,并且始终在H文件中:
#if !defined(_FLEXCAN_T4_H_)
#define _FLEXCAN_T4_H_
您声称在哪里看到缺陷?