__attribute__((weak) ) 函数导致未定义的引用
__attribute__((weak) ) function result in undefined reference
我目前正在尝试设置 CMock,以便使用 MinGW 和 CMake 对 STM32 进行单元测试。在我的配置文件中,我设置了 :weak: 选项,这样生成的 mock 就会给我弱函数。一个例子是:
#if defined (__IAR_SYSTEMS_ICC__)
#pragma weak HAL_TIM_IC_Init
#else
HAL_StatusTypeDef __attribute__((weak)) HAL_TIM_IC_Init(TIM_HandleTypeDef* htim);
#endif
HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef* htim)
{
...
}
然而,当我编译时,它给我未定义的引用 HAL_TIM_IC_Init 错误。
如果我删除 weak
属性,那么它不会给我未定义的引用错误。但是因为我需要覆盖HAL层提供的一些功能,所以我需要将模拟库设置为weak,否则会给我多个定义错误。
所以我的问题是为什么 weak 属性会导致未定义的引用错误,我该如何解决这个问题?
很明显,MinGW 不支持弱属性。当我移动到 ubuntu 时就可以了。
不确定我是否正确,但对于 MinGW 可能还有一个替代弱属性的方法,即使用 __declspec(selectany),但它似乎只适用于变量,因为当我应用到函数然后它给了我这个错误 'selectany' 属性仅适用于具有外部链接的初始化变量
我目前正在尝试设置 CMock,以便使用 MinGW 和 CMake 对 STM32 进行单元测试。在我的配置文件中,我设置了 :weak: 选项,这样生成的 mock 就会给我弱函数。一个例子是:
#if defined (__IAR_SYSTEMS_ICC__)
#pragma weak HAL_TIM_IC_Init
#else
HAL_StatusTypeDef __attribute__((weak)) HAL_TIM_IC_Init(TIM_HandleTypeDef* htim);
#endif
HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef* htim)
{
...
}
然而,当我编译时,它给我未定义的引用 HAL_TIM_IC_Init 错误。
如果我删除 weak
属性,那么它不会给我未定义的引用错误。但是因为我需要覆盖HAL层提供的一些功能,所以我需要将模拟库设置为weak,否则会给我多个定义错误。
所以我的问题是为什么 weak 属性会导致未定义的引用错误,我该如何解决这个问题?
很明显,MinGW 不支持弱属性。当我移动到 ubuntu 时就可以了。
不确定我是否正确,但对于 MinGW 可能还有一个替代弱属性的方法,即使用 __declspec(selectany),但它似乎只适用于变量,因为当我应用到函数然后它给了我这个错误 'selectany' 属性仅适用于具有外部链接的初始化变量