Определение extern-объявленной функции в структуре
Всех приветствую. В одном из заголовочных файлов проекта (в данном случае это модернизированная библиотека freemodbus 1.6) имеются extern объявления трех функций:
extern BOOL( *pxMBFrameCBByteReceived ) ( void );
extern BOOL( *pxMBFrameCBTransmitterEmpty ) ( void );
extern BOOL( *pxMBPortCBTimerExpired ) ( void );
Эти функции предполагается использовать в структуре следующего рода, объявленной в другом заголовочном файле
typedef struct modbus {
/* Use for RTU/TCP */
peMBFrameSend peMBFrameSendCur;
pvMBFrameStart pvMBFrameStartCur;
pvMBFrameStop pvMBFrameStopCur;
peMBFrameReceive peMBFrameReceiveCur;
pvMBFrameClose pvMBFrameCloseCur;
eMBMode eMBCurrentMode;
/* Use for RTU */
BOOL (*pxMBFrameCBByteReceived) (void);
BOOL (*pxMBFrameCBTransmitterEmpty) (void);
BOOL (*pxMBPortCBTimerExpired) (void);
UCHAR ucSlaveAddress;
UCHAR ucPort;
ULONG ulBaudRate;
eMBParity eParity;
/* Use for TCP */
USHORT ucTCPPort;
/* Status info */
enum {
STATE_ENABLED,
STATE_DISABLED,
STATE_NOT_INITIALIZED
} eMBState;
} modbus_t;
Так вот, при использовании функций, объявленных через extern, например так
void prvvUARTRxISR( void )
{
pxMBFrameCBByteReceived( );
}
Вижу следующую ошибку:
[build] /home/A.Popov/projects/waterpump_station/src/modbus/port/portserial.c:133: undefined reference to `pxMBFrameCBTransmitterEmpty'
[build] /opt/gcc-arm-none-eabi-10-2020-q4-major/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld: modbus/libmodbus.a(portserial.c.obj): in function `prvvUARTRxISR':
[build] /home/A.Popov/projects/waterpump_station/src/modbus/port/portserial.c:143: undefined reference to `pxMBFrameCBByteReceived'
Насколько знаю, это обозначает, что линковщик не понимает, где находится функция. Если вынести эти вещи из структуры – проблема уходит, однако, такое решение не подходит по ряду причин. Собственно, вопрос, можно ли при данном раскладе как-то таки оставить все в структуре и исправить ошибку?