CAN_Library icon indicating copy to clipboard operation
CAN_Library copied to clipboard

Can't compile sample for Due

Open bsculley opened this issue 6 years ago • 1 comments

I have installed the library and am trying to compile the SendCANMessages example.

I'm getting the following errors:

Arduino: 1.8.5 (Windows 10), TD: 1.41, Board: "Arduino Due (Native USB Port)"

libraries\CAN_Library\CAN_SAM3X.cpp.o:(.rodata._ZTV9CAN_SAM3X+0x20): undefined reference to `CANClass::setMask(unsigned char, CAN_Filter)'

libraries\CAN_Library\CAN_SAM3X.cpp.o:(.rodata._ZTV9CAN_SAM3X+0x24): undefined reference to `CANClass::setMask(CAN_Filter)'

libraries\CAN_Library\CAN_SAM3X.cpp.o:(.rodata._ZTV9CAN_SAM3X+0x28): undefined reference to `CANClass::clearMask(unsigned char)'

libraries\CAN_Library\CAN_SAM3X.cpp.o:(.rodata._ZTV9CAN_SAM3X+0x2c): undefined reference to `CANClass::setFilter(unsigned char, CAN_Filter)'

libraries\CAN_Library\CAN_SAM3X.cpp.o:(.rodata._ZTV9CAN_SAM3X+0x30): undefined reference to `CANClass::setFilter(CAN_Filter)'

libraries\CAN_Library\CAN_SAM3X.cpp.o:(.rodata._ZTV9CAN_SAM3X+0x34): undefined reference to `CANClass::clearFilter(unsigned char)'

libraries\CAN_Library\CAN_SAM3X.cpp.o:(.rodata._ZTV9CAN_SAM3X+0x38): undefined reference to `CANClass::enableRXInterrupt()'

libraries\CAN_Library\CAN_SAM3X.cpp.o:(.rodata._ZTV9CAN_SAM3X+0x3c): undefined reference to `CANClass::disableRXInterrupt()'

collect2.exe: error: ld returned 1 exit status

exit status 1
Error compiling for board Arduino Due (Native USB Port).

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

bsculley avatar Sep 11 '18 11:09 bsculley

I encountered the same errors from compiling the SendCANMessages example and noticed this section in CAN.h:

// Experimental
//
virtual void setMask(uint8_t maskID, CAN_Filter mask);
//
virtual void setMask(CAN_Filter mask);
//
virtual void clearMask(uint8_t maskID = 0);
//
virtual void setFilter(uint8_t filterID, CAN_Filter filter);
//
virtual void setFilter(CAN_Filter filter);
//
virtual void clearFilter(uint8_t filterID = 0);
//
virtual void enableRXInterrupt();
//
virtual void disableRXInterrupt();

There appear to be some functions in CAN.h that are not needed for the Due. In an effort to maintain functionality with other CAN controllers this library supports, I added preprocessor directives as follows:

#if defined(__SAM3X8E__) // Arduino Due
/*
#endif // __SAM3X8E__
// Experimental
//
virtual void setMask(uint8_t maskID, CAN_Filter mask);
//
virtual void setMask(CAN_Filter mask);
//
virtual void clearMask(uint8_t maskID = 0);
//
virtual void setFilter(uint8_t filterID, CAN_Filter filter);
//
virtual void setFilter(CAN_Filter filter);
//
virtual void clearFilter(uint8_t filterID = 0);
//
virtual void enableRXInterrupt();
//
virtual void disableRXInterrupt();
#if defined(__SAM3X8E__) // Arduino Due
*/
#endif // __SAM3X8E__

This fix should work for you as well.

DaleMitchell avatar Oct 13 '18 20:10 DaleMitchell