Определение 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'

Насколько знаю, это обозначает, что линковщик не понимает, где находится функция. Если вынести эти вещи из структуры – проблема уходит, однако, такое решение не подходит по ряду причин. Собственно, вопрос, можно ли при данном раскладе как-то таки оставить все в структуре и исправить ошибку?


Ответы (0 шт):