首页 > 解决方案 > __attribute__((weak) ) 函数导致未定义的引用

问题描述

我目前正在尝试设置 CMock 以使用 MinGW 和 CMake 对 STM32 进行单元测试。在我的配置文件中,我设置了 :weak: 选项,这样生成的模拟就会给我弱功能。一个例子是:

#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层提供的一些函数,所以需要将mocked库设为weak,否则会出现多个定义错误。

所以我的问题是为什么弱属性会导致未定义的引用错误,我该如何解决?

标签: cstm32weak-linkingcmock

解决方案


显然,MinGW 不支持弱属性。当我搬到 ubuntu 时就可以了。

不确定我是否正确,但对于 MinGW 的弱属性可能还有一个替代方法,即使用 __declspec(selectany),但它似乎只适用于变量,因为当我申请函数时,它给了我这个错误“selectany”属性仅适用于具有外部链接的初始化变量


推荐阅读